我分析的代码创建了Netty的NioDatagramChannelFactory UDP服务器。 它创建一个线程池:
ExecutorService threadPool = Executors.newCachedThreadPool();
则数据报通道,pipelineFactory&自举:
int workerCount = 10;
DatagramChannelFactory datagramChannelFactory = new NioDatagramChannelFactory(threadPool, workerCount);
ChannelPipelineFactory pipelineFactory = new SNMPTrapsPipeLineFactory();
ConnectionlessBootstrap bootStrap = new ConnectionlessBootstrap(datagramChannelFactory);
bootStrap.setPipelineFactory(pipelineFactory);
bootStrap.bind(new InetSocketAddress(host, port));
在pipelineFactory中,getPipeline()将自定义处理程序。
:就像它在说UDP消息的多线程处理
只有一个线程处理接收到的消息。 在日志中,线程名称显示为新的I / O报工人#1,如:
2012-04-20 09:20:51853的新I / O数据报工人#1 ' - ' 1个INFO [cemrshSNMPTrapsRequestHandler:42]的messageReceived | 处理:V1TRAP [reqestID = 0,...]
我阅读文档和此项目: UDP请求的地块与Netty的UDP服务器丢失
然后我根据这些条目修改一下代码。 现在,线程池与创建:
int corePoolSize = 5;
ExecutorService threadPool = new OrderedMemoryAwareThreadPoolExecutor(corePoolSize, 1048576, 1048576);
并拥有和ExecutionHandler的pipelineFactory:
ExecutionHandler executionHandler = new ExecutionHandler(threadPool);
ChannelPipelineFactory pipelineFactory = new SNMPTrapsPipeLineFactory(executionHandler);
而getPipeline()将像描述的处理程序:
public class SNMPTrapsPipeLineFactory implements ChannelPipelineFactory {
private ExecutionHandler executionHandler = null;
public SNMPTrapsPipeLineFactory(ExecutionHandler executionHandler) {
this.executionHandler = executionHandler;
}
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addFirst("ExecutorHandler", executionHandler);
// Here the custom handlers are added
pipeline.addLast( ... )
}
现在,我获取日志中的4个不同的线程名称。 他们将显示为池2线程1, 池2线程2,等...
例如:
2012-05-09 09:12:19589池-2-线程1 INFO [cemrshSNMPTrapsRequestHandler:46]的messageReceived | 处理:V1TRAP [reqestID = 0,...]
但他们并不进行并行处理。 的messageReceived下的处理()具有以完成在一个线程用于下一处理下一个消息。 我发送邮件的布赫来自不同客户机到服务器,而我得到的日志是不是隔行扫描。 我也尝试了Thread.sleep()内的messageReceived(),并印证了之前。
我缺少的东西吗? 有没有办法实现与Netty的一个真正的多线程UDP服务器? 我怎样才能得到不同的线程执行的messageReceived()同时?