Wątki nie działają jednocześnie w serwerze Netty UDP

Kod, który analizuję, tworzy serwer UDP za pomocą Netty NioDatagramChannelFactory. Tworzy pulę wątków z:

<code>ExecutorService threadPool = Executors.newCachedThreadPool();
</code>

Następnie kanał datagramowy, pipelineFactory i 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>

W pipelineFactory funkcja getPipeline () dodaje niestandardowe procedury obsługi.

Tak jak mówi się w:Wielowątkowa obsługa komunikatów UDP

Tylko jeden wątek przetwarza otrzymane wiadomości. W dziennikach nazwy wątków są wyświetlane jakoNowy pracownik datagramów I / O # 1 lubić:

2012-04-20 09: 20: 51.853 Nowy pracownik I / O datagramu # 1 '-' 1 INFO [c.e.m.r.s.h.SNMPTrapsRequestHandler: 42] messageReceived | Przetwarzanie: V1TRAP [reqestID = 0, ...]

Przeczytałem dokumentację i ten wpis:Wiele żądań UDP utraconych w serwerze UDP za pomocą Netty

Potem zmieniłem nieco kod zgodnie z tymi wpisami. Teraz pula wątków jest tworzona za pomocą:

<code>int corePoolSize = 5;
ExecutorService threadPool = new OrderedMemoryAwareThreadPoolExecutor(corePoolSize, 1048576, 1048576);
</code>

A pipelineFactory with i ExecutionHandler:

<code>ExecutionHandler executionHandler = new ExecutionHandler(threadPool);
ChannelPipelineFactory pipelineFactory = new SNMPTrapsPipeLineFactory(executionHandler);
</code>

A getPipeline () dodaje opisaną procedurę obsługi:

<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>

Teraz dostaję 4 różne nazwy wątków w dziennikach. Pojawiają się jakopool-2-thread-1, pool-2-thread-2, itp ...

Na przykład:

2012-05-09 09: 12: 19,589 basen-2-wątek-1 INFO [c.e.m.r.s.h.SNMPTrapsRequestHandler: 46] messageReceived | Przetwarzanie: V1TRAP [reqestID = 0, ...]

Ale nie są przetwarzane jednocześnie. Przetwarzanie pod messageReceived () musi kończyć się na jednym wątku, aby przetworzyć następną wiadomość. Wysłałem mnóstwo wiadomości od różnych klientów na serwer, a dzienniki, które otrzymałem, nie są przeplatane. Próbowałem także Thread.sleep () wewnątrz messageReceived () i potwierdzam poprzedni.

Czy czegoś mi brakuje? Czy istnieje sposób na uzyskanie PRAWDZIWEGO wielowątkowego serwera UDP z Netty? Jak mogę uzyskać różne wątki do jednoczesnego uruchomienia messageReceived ()?

questionAnswers(2)

yourAnswerToTheQuestion