protected void serviceStart() throws Exception {
this.client.start();
ThreadFactory tf = (new ThreadFactoryBuilder()).setNameFormat(this.getClass().getName() + " #%d").setDaemon(true).build();
int initSize = Math.min(10, this.maxThreadPoolSize);
this.threadPool = new ThreadPoolExecutor(initSize, 2147483647, 1L, TimeUnit.HOURS, new LinkedBlockingQueue(), tf);
this.eventDispatcherThread = new Thread() {
public void run() {
NMClientAsyncImpl.ContainerEvent event = null;
for(HashSet allNodes = new HashSet(); !NMClientAsyncImpl.this.stopped.get() && !Thread.currentThread().isInterrupted(); NMClientAsyncImpl.this.threadPool.execute(NMClientAsyncImpl.this.getContainerEventProcessor(event))) {
try {
event = (NMClientAsyncImpl.ContainerEvent)NMClientAsyncImpl.this.events.take();
} catch (InterruptedException var7) {
if (!NMClientAsyncImpl.this.stopped.get()) {
NMClientAsyncImpl.LOG.error("Returning, thread interrupted", var7);
}
return;
}
allNodes.add(event.getNodeId().toString());
int threadPoolSize = NMClientAsyncImpl.this.threadPool.getCorePoolSize();
if (threadPoolSize != NMClientAsyncImpl.this.maxThreadPoolSize) {
int nodeNum = allNodes.size();
int idealThreadPoolSize = Math.min(NMClientAsyncImpl.this.maxThreadPoolSize, nodeNum);
if (threadPoolSize < idealThreadPoolSize) {
int newThreadPoolSize = Math.min(NMClientAsyncImpl.this.maxThreadPoolSize, idealThreadPoolSize + 10);
NMClientAsyncImpl.LOG.info("Set NMClientAsync thread pool size to " + newThreadPoolSize + " as the number of nodes to talk to is " + nodeNum);
NMClientAsyncImpl.this.threadPool.setCorePoolSize(newThreadPoolSize);
}
}
}
}
};
this.eventDispatcherThread.setName("Container Event Dispatcher");
this.eventDispatcherThread.setDaemon(false);
this.eventDispatcherThread.start();
super.serviceStart();
}