2011-12-28 2 views
2

イベントドキュメント http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelEvent.htmlnettyはイベントの並行性を受け取りますか? DownStreamイベントとUpsreamイベントはどうですか?例えば

: は、同時に2つのイベントを取得することはできますか?

@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++; 
} 

正しいインクリメントされますか?

もう1つの質問です。

アップストリームイベントとダウンストリームイベントは同時に動作していますか?

答えて

0

はい、Nettyフレームワークはスレッドプールを保持します。それはスレッドを持つので、多くの 'messageRecieved'メソッドを同時に呼び出します。実行する各メソッドは、スレッドセーフである必要があります。右完了していない厥

+1

を呼び出されますそれとも、コンテンツを共有する必要がない場合は、あなただけのチャネルあたりハンドラの新しいインスタンスを追加することができます。他のオプションは、状態情報を共有するためにChannelLocalを使用することです。 javadocsをチェックアウトしてください:http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/ChannelLocal.html –

4

..

あなたがそれらスレッドセーフにする必要はありませんすべてのチャネルのための新しいハンドラのインスタンスを使用している場合。唯一の例外は、ダウンストリームイベントが任意のスレッドによって起動されるため、DownstreamHandlerを実装する場合です。

あなただけChannelUpstreamHandler気になるように限り、あなたは(あなたがチャネルあたり1つのハンドラを使用している場合)

+0

おそらく私のためにそれを明確にすることができます:IO労働者以外のスレッドが()は、ChannelPipelineを移動します。これまでのところ良いですが:どのスレッドで下流のイベントが実行されますか? NettyはIOワーカーを選んでいますか?はいの場合:アップストリームイベント(チャネルあたり1つのスレッド)と同じメカニックを使用しないのはなぜですか?そうでない場合:別のアップストリームイベントが実行されている間に非IOスレッドがロック取得を待つことを望まない場合、それは悪い考えではありませんか? (私は、暗号化のハンドシェイクのように長く実行することを考えています) – Chris

1

は、javadocので見つかった同期TODO必要はありません

スレッドの安全性

handleUpstreamになります同じスレッド(すなわち、I/Oスレッド)によって順次呼び出されるため、ハンドラは、前の上流のイベントが終了する前に新しい上流のイベントで呼び出されることを心配する必要はありません。

スレッドの安全性

handleDownstreamは、同時に複数のスレッドによって呼び出されてもよいです。ハンドラが共有リソースにアクセスしたり、ステートフルな情報を格納したりする場合は、ハンドラの実装で適切な同期が必要な場合があります。

messageReceivedは、上流のイベントであり、順次

関連する問題