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 ()?