2012-06-20 130 views
1

我已經使用Netty編寫了一個簡單的UDP服務器。服務器在特定接口上偵聽一個端口。JBoss Netty和UDP:多線程?

ChannelFactory factory = 
      new NioDatagramChannelFactory(
        Executors.newCachedThreadPool()); 

ConnectionlessBootstrap bootstrap = new ConnectionlessBootstrap(factory); 

bootstrap.getPipeline().addLast("MyHandler", new TestHandler()); 

bootstrap.bind(new InetSocketAddress(InetAddress.getByName("192.168.1.100"), 8080)); 

我使用的客戶端發送大量的UDP數據報到服務器。當我用VisualVM分析我的應用程序時,我發現只有一個線程(名爲New I/O worker#1)處理傳入的消息。是否如預期的那樣?

如果是,單個線程如何處理大量的傳入消息?我已經編寫了一個Spring集成應用程序,它監聽端口上的UDP數據報(使用UDP入站通道適配器),並且有一個線程在端口上偵聽,但此線程將傳入消息傳遞給其他線程一個水池。

感謝

回答

1

多少個內核,你有你的機器上?

如果您的處理程序管道線沒有進行任何阻塞或任何冗長的處理,那麼I/O處理總是比網絡快很多,即IO線程將閒置並等待工作相當大一部分時間。無需從池中分配另一個線程。

另一方面,如果您的處理程序涉及冗長的處理或阻止呼叫,例如數據庫或文件訪問,那麼你應該把處理交給一個ExecutionHandler,它將處理從IO工作池轉移到另一個線程池。

1

我會建議你使用反應堆模式與java.nio的 - 看看this -

+0

這不是內部由Netty處理的東西嗎? –

+0

我承認我知道Netty較少。過去我使用過JBoss遠程,而JBoss遠程使用java.nio的一種「包裝」。作爲一種良好的做法,我建議在查看包裝框架之前瞭解API基礎知識。 Reactor模式是一種不在nio中使用的模式,在其他框架和API(不僅僅是Java)中也是如此。我認爲所提供的文章會給你一個好的開始,然後,如果你想用Netty「放鬆你的生活」 - 去吧:) –