|
@@ -329,7 +329,6 @@ public abstract class Server {
|
|
|
private long cleanupInterval = 10000; //the minimum interval between
|
|
|
//two cleanup runs
|
|
|
private int backlogLength = conf.getInt("ipc.server.listen.queue.size", 128);
|
|
|
- private ExecutorService readPool;
|
|
|
|
|
|
public Listener() throws IOException {
|
|
|
address = new InetSocketAddress(bindAddress, port);
|
|
@@ -343,12 +342,12 @@ public abstract class Server {
|
|
|
// create a selector;
|
|
|
selector= Selector.open();
|
|
|
readers = new Reader[readThreads];
|
|
|
- readPool = Executors.newFixedThreadPool(readThreads);
|
|
|
for (int i = 0; i < readThreads; i++) {
|
|
|
Selector readSelector = Selector.open();
|
|
|
- Reader reader = new Reader(readSelector);
|
|
|
+ Reader reader = new Reader("Socket Reader #" + (i + 1) + " for port " + port,
|
|
|
+ readSelector);
|
|
|
readers[i] = reader;
|
|
|
- readPool.execute(reader);
|
|
|
+ reader.start();
|
|
|
}
|
|
|
|
|
|
// Register accepts on the server socket with the selector.
|
|
@@ -357,15 +356,16 @@ public abstract class Server {
|
|
|
this.setDaemon(true);
|
|
|
}
|
|
|
|
|
|
- private class Reader implements Runnable {
|
|
|
+ private class Reader extends Thread {
|
|
|
private volatile boolean adding = false;
|
|
|
private Selector readSelector = null;
|
|
|
|
|
|
- Reader(Selector readSelector) {
|
|
|
+ Reader(String name, Selector readSelector) {
|
|
|
+ super(name);
|
|
|
this.readSelector = readSelector;
|
|
|
}
|
|
|
public void run() {
|
|
|
- LOG.info("Starting SocketReader");
|
|
|
+ LOG.info("Starting " + getName());
|
|
|
synchronized (this) {
|
|
|
while (running) {
|
|
|
SelectionKey key = null;
|
|
@@ -419,6 +419,16 @@ public abstract class Server {
|
|
|
adding = false;
|
|
|
this.notify();
|
|
|
}
|
|
|
+
|
|
|
+ void shutdown() {
|
|
|
+ assert !running;
|
|
|
+ readSelector.wakeup();
|
|
|
+ try {
|
|
|
+ join();
|
|
|
+ } catch (InterruptedException ie) {
|
|
|
+ Thread.currentThread().interrupt();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/** cleanup connections from connectionList. Choose a random range
|
|
@@ -607,7 +617,9 @@ public abstract class Server {
|
|
|
LOG.info(getName() + ":Exception in closing listener socket. " + e);
|
|
|
}
|
|
|
}
|
|
|
- readPool.shutdown();
|
|
|
+ for (Reader r : readers) {
|
|
|
+ r.shutdown();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// The method that will return the next reader to work with
|