From ce6d1d709aaaf33d2cdfc7415a6e95b10faac2e5 Mon Sep 17 00:00:00 2001 From: Roger Meier Date: Sun, 24 Mar 2013 21:26:17 +0100 Subject: [PATCH] THRIFT-1869 TThreadPoolServer (java) dies when threadpool is consumed Patch: Brock Noland --- .../thrift/server/TThreadPoolServer.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/java/src/org/apache/thrift/server/TThreadPoolServer.java b/lib/java/src/org/apache/thrift/server/TThreadPoolServer.java index 19e51af4..38dfd582 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 @@ public class TThreadPoolServer extends TServer { 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; -- 2.17.1