Threads que não estão sendo executados simultaneamente no servidor Netty UDP
O código que estou analisando cria o servidor UDP com o Netty NioDatagramChannelFactory. Cria um conjunto de encadeamentos com:
<code>ExecutorService threadPool = Executors.newCachedThreadPool(); </code>
Em seguida, o canal de datagramas, pipelineFactory & bootstrap:
<code>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)); </code>
No pipelineFactory, o getPipeline () adiciona os manipuladores personalizados.
Assim como é dito em:Tratamento multi-thread de mensagens UDP
Há apenas um thread processando as mensagens recebidas. Nos logs, os nomes dos segmentos aparecem comoNovo datagrama trabalhador I / O # 1 gostar:
2012-04-20 09: 20: 51,853 Novo trabalhador de datagrama de I / O # 1 '-' 1 INFO [c.e.m.r.s.h.SNMPTrapsRequestHandler: 42] messageReceived | Processando: V1TRAP [reqestID = 0, ...]
Eu li a documentação e esta entrada:Muitos pedidos UDP perdidos no servidor UDP com o Netty
E então eu mudei um pouco o código de acordo com essas entradas. Agora o pool de threads é criado com:
<code>int corePoolSize = 5; ExecutorService threadPool = new OrderedMemoryAwareThreadPoolExecutor(corePoolSize, 1048576, 1048576); </code>
E o pipelineFactory com e o ExecutionHandler:
<code>ExecutionHandler executionHandler = new ExecutionHandler(threadPool); ChannelPipelineFactory pipelineFactory = new SNMPTrapsPipeLineFactory(executionHandler); </code>
E o getPipeline () adiciona o manipulador como descrito:
<code>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( ... ) } </code>
Agora, eu recebo 4 nomes diferentes de threads nos logs. Eles aparecem comopool-2-thread-1, pool-2-thread-2, etc ...
Por exemplo:
2012-05-09 09: 12: 19,589 pool-2-thread-1 INFO [c.e.m.r.s.h.SNMPTrapsRequestHandler: 46] messageReceived | Processando: V1TRAP [reqestID = 0, ...]
Mas eles não são processados simultaneamente. O processamento sob messageReceived () tem que terminar em um thread para o próximo para processar a próxima mensagem. Enviei um buch de mensagens de clientes diferentes para o servidor, e os logs que recebi não estão entrelaçados. Eu também tentei Thread.sleep () dentro messageReceived () e confirma o anterior.
Estou esquecendo de algo? Existe uma maneira de obter um servidor UDP multi-threaded REAL com o Netty? Como posso obter segmentos diferentes para executar messageReceived () simultaneamente?