2012-03-16 21 views
2

の1つのインスタンスを共有この質問ではHashedWheelTimer

Netty Comet Async request time out

それは、パイプラインの間HashedWheelTimerの1つのインスタンスを共有するために、私に示唆されました。

私の現在のコードは、私の知る限り、私はパイプラインの間HashedWheelTimerの1つのインスタンスを共有するが、IdleStateHandlerの新しいインスタンスを毎回作成するか見CAとしてこの

@Override 
    public ChannelPipeline getPipeline() throws Exception { 
    ChannelPipeline pipeline = Channels.pipeline(); 
    pipeline.addLast("decoder", new HttpRequestDecoder()); 
    pipeline.addLast("encoder", new HttpResponseEncoder()); 
    pipeline.addLast("handler", new HTTPRequestHandler()); 
    Timer timer = new HashedWheelTimer(); 
    pipeline.addLast("timeout", new IdleStateHandler(timer, 30, 30, 0)); 
    return pipeline; 

のように見えます。

間違っていますか?誰でもそれを正しく行う方法について私を助けることができますか? IdleStateHandlerHashedWheelTimerのインスタンスを静的にする必要がありますか?

答えて

3

間違っています。

このパイプラインでは、新しいチャンネルごとに独自のHashedWheelTimerインスタンスが作成されます。あなたが唯一のインスタンスとアプリケーション間で共有 それを作成するようにしてくださいネッティーHashedWheelTimerドキュメント

から

。 アプリケーションが応答しなくなるという一般的な間違いの1つは、すべての接続に対して新しいインスタンスを作成することです。

HashedWheelTimerインスタンスを静的に変更する必要があります。そのままIdleStateHandlerをそのまま使用してください。

+0

返信いただきありがとうございます.HishedWheelTimerをPipelineの工場クラス外で開始し、その参照をコンストラクタに渡すことはできますか?どの方法が好ましいですか? –

+0

HashedWheelTimerインスタンスを静的に初期化し、参照を渡すことは問題ありません。複数のパイプラインがある場合は、ファクトリメソッドが優先されます。 –

+0

@ JestanNirojanありがとう、この回答は私にとっても役に立ちました。同じ 'HashedWheelTimer'を様々な' ChannelPipeline'間で共有するべきですか?つまり、 'ChannelPipelineFactory'クラス内に静的な' Timer'変数を宣言し、 'Channels.pipeline()'を呼び出して作成したすべての私の 'ChannelPipeline'を使ってそれを使用できますか? – gravetii

関連する問題