2016-05-27 31 views
0

我正在學習Netty,但我無法明確Netty線程。在Netty中處理長時間任務(如SQL查詢)

哪個是IO線程?我在網上閱讀了一些頁面,其中說你不能阻塞IO線程。但是,我不知道哪個IO線程是。

例如:

b = new ServerBootstrap(); 
b.group(bossGroup, workerGroup) 
    .channel(NioServerSocketChannel.class) 
    .childHandler(new SimpleChatServerInitializer()) // (4) 
    .option(ChannelOption.SO_BACKLOG, 128)   // (5) 
    .childOption(ChannelOption.SO_KEEPALIVE, true); // (6) 

WorkGroupbossGroup

回答

1

bossGroup和workerGroup都是爲I/O處理提供線程的線程池。 bossGroup線程處理客戶端連接請求,並接受連接併爲每個客戶端創建一個通道。之後,來自workerGroup的線程將被單獨分配給可能同時具有入站和出站數據包的此通道。對於入站數據包,工作線程將由事件調用並需要讀取數據包。對於出站數據包,工作線程需要將它們寫入通道套接字緩衝區進行發送。這就是爲什麼它們都是I/O線程。

然後,爲了準備(從MySQL/MongoDB等持久性存儲中獲取消息/數據),如果將業務邏輯放入同一個工作線程,它將被阻塞。在更糟糕的情況下,如果相同的工作線程正被其他通道使用/共享。業務邏輯將阻止可能有緊急(時間敏感)數據包處理的其他通道的I/O。這會導致問題。因此,您應該讓業務邏輯在不同的線程(例如,用戶定義的線程)中執行,或者您可以創建單獨的EventExecutorGroup並讓業務邏輯處理程序位於該線程組中。

希望以上幫助。

+0

謝謝,我明白了。如果我嘗試將mysql查詢放入user_defined線程,如何記錄.channel並返回到工作線程以寫入客戶端 –

+0

的信息。您只需將通道引用引入自己的線程,以便您可以使用channel.writeAndFlush(SOME-DATA-OBJECT)編寫頻道。但最好的做法是不要定義你自己的線程。請結帳[DefaultEventExecutorGroup](http://netty.io/5.0/api/io/netty/util/concurrent/DefaultEventExecutorGroup.html) –

+0

,我將學習更多關於netty –