2011-12-28 43 views
2

事件文檔 http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelEvent.htmlnetty是否接收事件併發? DownStream和Upsream事件如何?

例如: 可以同時獲得兩個事件?

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 
    Thread.sleep(10000); 
} 

如果messageReceived需要很長時間,我可以在另一個線程中接收另一個messageReceived嗎? 或netty有所有事件的隊列?

另一個例子

int i=0; 

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 
    i++; 
} 

是增量是否正確?

另一個問題。

上游事件和下游事件是否同時工作?

回答

0

是的,netty框架保持一個線程池。它會同時調用盡可能多的'messageRecieved'方法,因爲它有線程。您執行的每種方法都需要線程安全。如果你使用一個新的處理程序實例爲你不需要讓他們線程安全的每個通道

+1

或者你也可以添加每個信道處理程序的新實例,如果你不需要共享內容。另一種選擇是使用ChannelLocal共享狀態信息。簽出javadocs:http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelLocal.html – 2012-01-07 16:48:15

4

那不是完全性右..

。唯一的例外是當你實現一個DownstreamHandler時,任何線程都可以觸發下游事件。

所以只要你只關心ChannelUpstreamHandler你不需要任何待辦事項同步(如果使用每通道一個處理器)

+0

也許你可以澄清一下,對於我來說:如果一個線程在IO工作者之外調用write ()它將沿着ChannelPipeline行進。到目前爲止這麼好,但是:下游事件執行的線程將在哪個線程中執行? netty會爲此選擇一個IO Worker嗎?如果是:爲什麼它不使用與上游事件相同的機制(每個通道一個線程)。如果不是:如果我不希望非IO線程在另一個上游事件執行期間等待鎖獲取,那麼這不是一個壞主意嗎? (我認爲像加密握手那樣可以運行更長的東西) – Chris 2013-06-02 20:18:21

1

在Javadoc發現

線程安全

handleUpstream會由相同的線程(即I/O線程)按順序調用,因此在上一個上游事件完成之前,處理程序不需要擔心被新的上游事件調用​​。

線程安全

handleDownstream可能會被多個線程同時調用。如果處理程序訪問共享資源或存儲有狀態信息,則可能需要在處理程序實現中進行適當的同步。

的messageReceived是上游事件,將依次調用