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:
ExecutorService threadPool = Executors.newCachedThreadPool();
Następnie kanał datagramowy, pipelineFactory i bootstrap:
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));
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ą:
int corePoolSize = 5;
ExecutorService threadPool = new OrderedMemoryAwareThreadPoolExecutor(corePoolSize, 1048576, 1048576);
A pipelineFactory with i ExecutionHandler:
ExecutionHandler executionHandler = new ExecutionHandler(threadPool);
ChannelPipelineFactory pipelineFactory = new SNMPTrapsPipeLineFactory(executionHandler);
A getPipeline () dodaje opisaną procedurę obsługi:
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( ... )
}
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 ()?