Author: dreiss
Date: Tue Jun 10 18:20:54 2008
New Revision: 666502
URL: http://svn.apache.org/viewvc?rev=666502&view=rev
Log:
Java/TThreadPoolServer: Shut down more gracefully. (THRIFT-11)
Modified:
incubator/thrift/trunk/lib/java/src/com/facebook/thrift/server/TThreadPoolServer.java
Modified:
incubator/thrift/trunk/lib/java/src/com/facebook/thrift/server/TThreadPoolServer.java
URL:
http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/java/src/com/facebook/thrift/server/TThreadPoolServer.java?rev=666502&r1=666501&r2=666502&view=diff
==============================================================================
---
incubator/thrift/trunk/lib/java/src/com/facebook/thrift/server/TThreadPoolServer.java
(original)
+++
incubator/thrift/trunk/lib/java/src/com/facebook/thrift/server/TThreadPoolServer.java
Tue Jun 10 18:20:54 2008
@@ -176,11 +176,22 @@
}
executorService_.shutdown();
- try {
- executorService_.awaitTermination(options_.stopTimeoutVal,
- options_.stopTimeoutUnit);
- } catch (InterruptedException ix) {
- // Ignore and more on
+
+ // Loop until awaitTermination finally does return without a interrupted
+ // exception. If we don't do this, then we'll shut down prematurely. We
want
+ // to let the executorService clear it's task queue, closing client sockets
+ // appropriately.
+ long timeoutMS =
options_.stopTimeoutUnit.toMillis(options_.stopTimeoutVal);
+ long now = System.currentTimeMillis();
+ while (timeoutMS >= 0) {
+ try {
+ executorService_.awaitTermination(timeoutMS, TimeUnit.MILLISECONDS);
+ break;
+ } catch (InterruptedException ix) {
+ long newnow = System.currentTimeMillis();
+ timeoutMS -= (newnow - now);
+ now = newnow;
+ }
}
}
@@ -220,7 +231,9 @@
outputTransport = outputTransportFactory_.getTransport(client_);
inputProtocol = inputProtocolFactory_.getProtocol(inputTransport);
outputProtocol = outputProtocolFactory_.getProtocol(outputTransport);
- while (processor.process(inputProtocol, outputProtocol)) {}
+ // we check stopped_ first to make sure we're not supposed to be
shutting
+ // down. this is necessary for graceful shutdown.
+ while (!stopped_ && processor.process(inputProtocol, outputProtocol))
{}
} catch (TTransportException ttx) {
// Assume the client died and continue silently
} catch (TException tx) {