2016-09-15 42 views
0

ChannelInitializer.initChannel方法被調用爲每個新連接,了Netty 4:在不同的流水線份額處理器

pipeline.addLast(new HttpServerCodec()); 
pipeline.addLast(new HttpObjectAggregator(65536)); 
pipeline.addLast(new ServerWebSocketServerProtocolHandler("/api", "*", false)); 

我可以重用所有連接相同的實例?如何判斷特定處理程序是否可以跨多個連接重用?

回答

0

您可以重複使用的處理程序使用@Sharable進行註釋,這意味着可以保證無狀態。

只需繼續並檢查不同處理程序的文檔。

例如HttpServerCodecHttpObjectAggregator是可共享的。

最後的處理程序可能是您已經實現的自定義處理程序,至少我不熟悉它。這取決於你的實施。

否則,您可以重複使用前兩個處理程序,方法是創建它們的靜態實例並僅爲每個連接重新創建最後一個處理程序。

+1

你確定'HttpServerCodec'和'HttpObjectAggregatorare'是可共享的嗎?我檢查了它們的源代碼,它們沒有用'@ Sharable'註釋 https://github.com/netty/netty/blob/f6c16f4897ce395011c70c0351a0ddc3d6c21337/codec-http/src/main/java/io/netty/handler /codec/http/HttpObjectAggregator.java https://github.com/netty/netty/blob/83c349ffa94d3992c4ee511d3625afc0c97c12bb/codec-http/src/main/java/io/netty/handler/codec/http/HttpServerCodec.java –

+0

對不起,你完全正確。他們不可共享,因爲他們自己不使用註釋。我被文檔的繼承摘要誤導了,這隻意味着班級知道註釋。 所以非提及的處理程序是可共享的,因爲它們都已滿狀態。 –