我在我的系統中有3個ThreadPoolExecutors。Netty線程被阻塞
一個用於Netty的主進程,另一個用於netty的工作進程,最後一個用於處理即席處理(向郵件服務器發送請求)。
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
開始向郵件服務器發出請求之後,它才能正常工作。在此之前,批量請求使用mailExecutor
,通常向郵件服務器發送超過5000個請求,網絡線程被阻止。
我不明白爲什麼netty線程似乎會被阻止,因爲我已經分配了明確的線程池。在此期間,Netty甚至無法處理單個請求。
任何想法爲什麼發生或我做錯了什麼?
謝謝。
我使用工作人員將固定線程池更改爲緩存線程池count = Runtime.getRuntime()。availableProcessors() 但它似乎仍在發生。 這裏是線程轉儲:http://dl.dropbox.com/u/360993/jstack.txt 謝謝。 – 2011-12-22 20:07:02
問題是發送到郵件服務器是一個阻止操作。所以你應該在發送處理程序的前面添加一個ExecutionHandler。否則,你將阻塞netty的IO線程。 – 2012-01-08 20:17:00