Потоки, не выполняющиеся одновременно на UDP-сервере Netty
Код, который я анализирую, создает сервер UDP с Netty NioDatagramChannelFactory. Он создает пул потоков с:
<code>ExecutorService threadPool = Executors.newCachedThreadPool(); </code>
Затем канал дейтаграмм, pipeFactory & amp; самонастройки:
<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>
В pipeFactory метод getPipeline () добавляет пользовательские обработчики.
Также как сказано в: Многопоточная обработка сообщений UDP
Есть только один поток, обрабатывающий полученные сообщения. В журналах имена потоков отображаются какNew I/O datagram worker #1 лайк:
2012-04-20 09: 20: 51,853 Новый работник дейтаграммы ввода-вывода # 1 '- -' 1 INFO [c.e.m.r.s.h.SNMPTrapsRequestHandler: 42] messageReceived | Обработка: V1TRAP [reqestID = 0, ...]
Я прочитал документацию и эту запись:Много UDP-запросов потеряно на UDP-сервере с Netty
А потом я немного изменил код в соответствии с этими записями. Теперь пул потоков создается с помощью:
<code>int corePoolSize = 5; ExecutorService threadPool = new OrderedMemoryAwareThreadPoolExecutor(corePoolSize, 1048576, 1048576); </code>
И конвейер фабрики с и ExecutionHandler:
<code>ExecutionHandler executionHandler = new ExecutionHandler(threadPool); ChannelPipelineFactory pipelineFactory = new SNMPTrapsPipeLineFactory(executionHandler); </code>
И getPipeline () добавляет обработчик, как описано:
<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>
Теперь я получаю 4 разных имени потока в журналах. Они появляются какpool-2-thread-1, pool-2-thread-2, так далее...
Например:
2012-05-09 09: 12: 19,589 ИНФОРМАЦИЯ о pool-2-thread-1 [c.e.m.r.s.h.SNMPTrapsRequestHandler: 46] messageReceived | Обработка: V1TRAP [reqestID = 0, ...]
Но они не обрабатываются одновременно. Обработка в messageReceived () должна завершиться в одном потоке для следующего, чтобы обработать следующее сообщение. Я отправил на сервер кучу сообщений от разных клиентов, и журналы, которые я получаю, не переплетаются. Я также пытался Thread.sleep () внутри messageReceived (), и подтверждает предыдущее.
Я что-то пропустил? Есть ли способ добиться НАСТОЯЩЕГО многопоточного сервера UDP с Netty? Как я могу получить разные потоки для одновременного выполнения messageReceived ()?