2012-03-16 29 views
2

的一個實例,在這個問題上共享HashedWheelTimer

Netty Comet Async request time out

有人建議對我來說,管道之間共享的HashedWheelTimer一個實例。

我當前的代碼看起來像這樣

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

至於我Ca見我做分享的管道之間HashedWheelTimer一個實例,但創造的每一次IdleStateHandler新的實例。

它錯了嗎?任何人都可以幫助我如何正確地做到這一點?我應該使IdleStateHandlerHashedWheelTimer是靜態的嗎?

回答

3

這是錯誤的。

通過這個管道,每個新通道都有自己的HashedWheelTimer實例。

從Netty的HashedWheelTimer DOC

你應該確保只創建一個實例,並在您的應用程序 分享。其中一個常見錯誤是,使您的應用程序無響應的 是爲每個連接創建一個新實例。

您應該將HashedWheelTimer實例更改爲靜態,將IdleStateHandler保持原樣。

+0

感謝您的回覆,可以在Pipeline工廠類之外啓動HashedWheelTimer並在構造函數中傳遞它的引用嗎?哪種方法是首選? – 2012-03-18 14:23:37

+0

將HashedWheelTimer實例初始化爲靜態並傳遞引用應該沒問題,如果您有多個管道,則首選工廠方法。 – 2012-03-18 17:39:30

+0

@JestanNirojan謝謝,這個答案對我也很有用。那麼應該在各種'ChannelPipeline'之間共享同一個'HashedWheelTimer'嗎?換句話說,我可以在'ChannelPipelineFactory'類中聲明一個靜態的'Timer'變量,並通過調用'Channels.pipeline()'創建的所有''ChannelPipeline'中使用它。 – gravetii 2014-05-27 17:30:15