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?

questionAnswers(2)

yourAnswerToTheQuestion