import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerTransport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* An extension of the TNonblockingServer to a Half-Sync/Half-Async server.
* Like TNonblockingServer, it relies on the use of TFramedTransport.
*/
public class THsHaServer extends TNonblockingServer {
+ private static final Logger LOGGER =
+ LoggerFactory.getLogger(THsHaServer.class.getName());
// This wraps all the functionality of queueing and thread pool management
// for the passing of Invocations from the Selector to workers.
* invoker service instead of immediately invoking. The thread pool takes care of the rest.
*/
@Override
- protected void requestInvoke(FrameBuffer frameBuffer) {
- invoker.execute(new Invocation(frameBuffer));
+ protected boolean requestInvoke(FrameBuffer frameBuffer) {
+ try {
+ invoker.execute(new Invocation(frameBuffer));
+ return true;
+ } catch (RejectedExecutionException rx) {
+ LOGGER.warn("ExecutorService rejected execution!", rx);
+ return false;
+ }
}
/**
* Perform an invocation. This method could behave several different ways
* - invoke immediately inline, queue for separate execution, etc.
*/
- protected void requestInvoke(FrameBuffer frameBuffer) {
+ protected boolean requestInvoke(FrameBuffer frameBuffer) {
frameBuffer.invoke();
+ return true;
}
/**
*/
private void handleRead(SelectionKey key) {
FrameBuffer buffer = (FrameBuffer)key.attachment();
- if (buffer.read()) {
- // if the buffer's frame read is complete, invoke the method.
- if (buffer.isFrameFullyRead()) {
- requestInvoke(buffer);
- }
- } else {
+ if (!buffer.read()) {
cleanupSelectionkey(key);
+ return;
+ }
+
+ // if the buffer's frame read is complete, invoke the method.
+ if (buffer.isFrameFullyRead()) {
+ if (!requestInvoke(buffer)) {
+ cleanupSelectionkey(key);
+ }
}
}