私が分析しているコードは、Netty NioDatagramChannelFactory で UDP サーバーを作成します。以下を使用してスレッドプールを作成します。
ExecutorService threadPool = Executors.newCachedThreadPool();
次に、データグラム チャネル、pipelineFactory & ブートストラップ:
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));
pipelineFactory では、getPipeline() がカスタム ハンドラを追加します。
それが言われているように: UDPメッセージのマルチスレッド処理
受信したメッセージを処理するスレッドは 1 つだけです。ログでは、スレッド名は次のようにNew I/O datagram worker #1として表示されます。
2012-04-20 09:20:51,853 新しい I/O データグラム ワーカー #1'-'1 INFO [cemrshSNMPTrapsRequestHandler:42] messageReceived | 処理:V1TRAP[reqestID=0, ...]
ドキュメントとこのエントリを読みました: Netty を使用した UDP サーバーで失われた UDP 要求のロット
そして、それらのエントリに従ってコードを少し変更しました。これで、スレッド プールが次のように作成されます。
int corePoolSize = 5;
ExecutorService threadPool = new OrderedMemoryAwareThreadPoolExecutor(corePoolSize, 1048576, 1048576);
そして、パイプラインファクトリーと ExecutionHandler:
ExecutionHandler executionHandler = new ExecutionHandler(threadPool);
ChannelPipelineFactory pipelineFactory = new SNMPTrapsPipeLineFactory(executionHandler);
そして、 getPipeline() は、次のようにハンドラーを追加します。
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( ... )
}
現在、ログに 4 つの異なるスレッド名が記録されています。それらは、pool-2-thread-1、pool-2-thread-2などとして表示されます...
例えば:
2012-05-09 09:12:19,589 プール 2 スレッド 1 情報 [cemrshSNMPTrapsRequestHandler:46] messageReceived | 処理:V1TRAP[reqestID=0, ...]
ただし、それらは同時に処理されません。messageReceived() の下の処理は、次のメッセージを処理するために次のスレッドで終了する必要があります。さまざまなクライアントからサーバーに大量のメッセージを送信しましたが、取得したログはインターレースされていません。また、messageReceived() 内で Thread.sleep() を試み、前のことを確認しました。
何か不足していますか?Netty で REAL マルチスレッド UDP サーバーを実現する方法はありますか? 複数のスレッドで messageReceived() を同時に実行するにはどうすればよいですか?