THRIFT-1869 TThreadPoolServer (java) dies when threadpool is consumed
Patch: Brock Noland
diff --git a/lib/java/src/org/apache/thrift/server/TThreadPoolServer.java b/lib/java/src/org/apache/thrift/server/TThreadPoolServer.java
index 19e51af..38dfd58 100644
--- a/lib/java/src/org/apache/thrift/server/TThreadPoolServer.java
+++ b/lib/java/src/org/apache/thrift/server/TThreadPoolServer.java
@@ -20,6 +20,7 @@
package org.apache.thrift.server;
import java.util.concurrent.ExecutorService;
+import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -121,7 +122,24 @@
try {
TTransport client = serverTransport_.accept();
WorkerProcess wp = new WorkerProcess(client);
- executorService_.execute(wp);
+ while(true) {
+ int rejections = 0;
+ try {
+ executorService_.execute(wp);
+ break;
+ } catch(RejectedExecutionException ex) {
+ LOGGER.warn("ExecutorService rejected client " + (++rejections) +
+ " times(s)", ex);
+ try {
+ TimeUnit.SECONDS.sleep(1);
+ } catch (InterruptedException e) {
+ LOGGER.warn("Interrupted while waiting to place client on" +
+ " executor queue.");
+ Thread.currentThread().interrupt();
+ break;
+ }
+ }
+ }
} catch (TTransportException ttx) {
if (!stopped_) {
++failureCount;