私は自分のシステムに3つのThreadPoolExecutorsを持っています。Nettyスレッドがブロックされています
Nettyのマスタプロセスの1つ、もう1つはNettyのワーカープロセス用、もう1つはアドホック処理(メールサーバへの要求送信)のためのものです。
ExecutorService bossExecutors = Executors.newFixedThreadPool(1, new
ServerThreadFactory("netty-boss")); ExecutorService workerExecutors =
Executors.newFixedThreadPool(10, new
ServerThreadFactory("netty-worker"));
ChannelFactory factory = new NioServerSocketChannelFactory(
bossExecutors,
workerExecutors,
Runtime.getRuntime().availableProcessors());
ExecutorService mailExecutor = Executors.newFixedThreadPool(40);
これは、mailExecutor
がメールサーバーに要求を開始するまで完全に正常に動作します。一般的に、メールサーバへの5000回以上のリクエストが完了すると、そのバッチはmailExecutor
を使用してリクエストされ、ネットスレッドはブロックされます。
私は明確なスレッドプールを割り当てているので、なぜnettyスレッドがブロックされているように見えるのか分かりません。その間、Nettyは単一の要求を処理することさえできません。
なぜそれが起こっているのか、私が間違っているのか?
ありがとうございました。
私は、worker count = Runtime.getRuntime()。availableProcessors()を使用して固定スレッドプールをCached ThreadPoolに変更しました。 しかし、それはまだ起こっているようです。 ここにスレッドダンプがあります:http://dl.dropbox.com/u/360993/jstack.txt ありがとうございました。 –
問題は、メールサーバーへの送信がブロック操作であることです。したがって、送信を行うハンドラの前にExecutionHandlerを追加する必要があります。さもなければ、あなたはネットのIOスレッドをブロックします。 –