package org.sergilos.servicemanager.wrappers; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TMultiplexedProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadedSelectorServer; import org.apache.thrift.transport.*; import org.sergilos.servicemanager.AbstractRunnableServiceWrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; public class ServiceThreadPoolWrapper extends AbstractRunnableServiceWrapper { private static final Logger LOGGER = LoggerFactory.getLogger(ServiceThreadPoolWrapper.class); private int remotePort; private int numSelectorThreads; private int numWorkerThreads; private ServiceThreadPoolWrapper(ApplicationContext applicationContext, String serviceName, int remotePort, int numSelectorThreads, int numWorkerThreads) { super(applicationContext, serviceName); LOGGER.debug("Service setup: {}", serviceName); this.remotePort = remotePort; this.numSelectorThreads = numSelectorThreads; this.numWorkerThreads = numWorkerThreads; } @Override protected TServer getServer(TProcessor processor) throws TTransportException { LOGGER.debug("Setting Server with {} selector threads and {} worker threads", numSelectorThreads, numWorkerThreads); TNonblockingServerSocket transport = new TNonblockingServerSocket(remotePort); TThreadedSelectorServer.Args args = new TThreadedSelectorServer.Args(transport); args.transportFactory(new TFramedTransport.Factory()); args.protocolFactory(new TBinaryProtocol.Factory()); args.processor(processor); args.selectorThreads(numSelectorThreads); args.workerThreads(numWorkerThreads); return new TThreadedSelectorServer(args); } public static class ServiceThreadPoolWrapperFactory extends ServiceWrapperFactory { private int numSelectorThreads = 2; private int numWorkerThreads = 5; public ServiceThreadPoolWrapperFactory(int numSelectorThreads, int numWorkerThreads) { this.numSelectorThreads = numSelectorThreads; this.numWorkerThreads = numWorkerThreads; } public ServiceThreadPoolWrapperFactory() { } @Override public AbstractRunnableServiceWrapper getServiceServerWrapper(ApplicationContext applicationContext, String serviceName, Integer port) { return new ServiceThreadPoolWrapper(applicationContext, serviceName, port, numSelectorThreads, numWorkerThreads); } public TProtocol getClientProtocol(String serviceInterfaceClassName, String host, Integer port) throws TTransportException { TSocket localhostSocket = new TSocket(host, port); localhostSocket.open(); TProtocol protocol = new TBinaryProtocol(new TFramedTransport(localhostSocket)); return new TMultiplexedProtocol(protocol, serviceInterfaceClassName); } } }