2012-01-04 37 views
3

在netty中,流經通道流水線的事件按順序發生,因爲每個通道只能有效地分配給一個線程,並且每個處理器依次相互調用。這是有道理的,並緩解許多同步問題。瞭解Netty對線程的使用

但是,如果您使用IdleStateHandler,那麼在讀取源代碼時,看起來channelIdle事件將在定時器線程(例如HashedWheelTime所使用的線程)中「處理」。

是這種情況還是我錯過了什麼?如果是這樣,這是否意味着idlestate事件和IO事件(例如messageRecieved事件)可能同時在同一個通道上執行?

另外,因爲我可以保存ChannelHandler ctx並將其用於不同的線程以「寫入」某個通道,因此在一個線程中下游事件並且同時在另一個線程中上行同一個頻道?

最後哪個線程做ChannelFutures執行?

所有這些用例都是完全可以接受的,根本不是對Netty的批評,實際上我非常喜歡這個庫,並在各處使用它。它只是當我試圖用它做更多更復雜的事情時,我想更多地瞭解它如何在引擎蓋下工作,這樣我就可以確保我使用正確和恰當的量(不多也不少)同步(鎖定)。

回答

4

是可以同時觸發channelIdle事件和下游/上游事件。因此,如果您的處理程序確實實施了三個中的至少兩個,則需要添加適當的同步。我想我們應該讓中的javadoc更加清晰..

現在其他問題..

你可以從你想太多每個線程調用Channel.write(......)所以它可能只需將它存儲在某個地方,並隨時致電寫入。這也給出了「限制」,你需要對「下游」處理程序進行適當的同步。

ChannelFutures從工作線程內執行。

+0

感謝您的答案,正是我需要知道的。 – user1129382 2012-01-04 22:38:25

1

但是,如果您使用IdleStateHandler,則從讀取源代碼後,看起來channelIdle事件將在定時器線程(例如HashedWheelTime所使用的線程)中「處理」。

是這種情況還是我錯過了什麼?如果是這樣,這是否意味着idlestate事件和IO事件(例如messageRecieved事件)可能同時在同一個通道上執行?

是的,你已經錯過了在Netty中提供指示事件執行的概念,如果你不是在管道與OrderedMemoryAwareThreadPoolExecutor巡航能力ExecutionHandler,你不能有有序事件執行,從IdleStateHandler專門信道狀態的事件。

而且,如我可以節省的ChannelHandler CTX,並用它在不同的線程到「寫」到例如信道,因此也有一個事件在相同的在一個線程去下游和上游在另一個線程時間在同一頻道?

是它的正確。

如果您希望在下游執行有序事件執行,則您有一個帶OrderedMemoryAwareThreadPoolExecutor的下游執行處理程序impl。

最後哪個線程做ChannelFutures執行?

的由奧約/仁王工作線程執行,

但是如果你往下流處理器消耗一些類型的事件和發射其他類型的事件的下面的下游,那麼你的下游處理程序可以選擇處理未來的執行。這可以通過獲得未來形式的下游事件和呼籲

future.setSuccess() 
+0

感謝您的闡述:) – user1129382 2012-01-04 22:38:57