2012-01-23 73 views
6

我想創建處理程序等的管道:Netty的 - 如何通過處理器之間的信息在同一管道

public ChannelPipeline getPipeline() throws Exception 
{ 
    return Channels.pipeline(
      new ObjectEncoder(), 
      new ObjectDecoder(), 
      new AuthenticationServerHandler(), 
      new BusinessLogicServerHandler()); 
} 

這裏的關鍵是,我想的AuthenticationServerHandler能夠通過登錄信息到BusinessLogicServerHandler

我明白,你可以使用Attachment,但只存儲該處理程序的信息,管道中的其他處理程序不能訪問它。我也注意到有一種叫做ChannelLocal的東西可能會訣竅,但是我找不到任何有關如何使用它的真實信息。我所見過的是人們爲它創建一個靜態實例,但是如何在另一個處理程序中檢索和訪問信息?假設這是正確的方法。

我的問題是:如何在同一管道中的處理程序之間傳遞信息。在上面的示例中,我如何將登錄憑證從AuthenticationServerHandler傳遞到BusinessLogicServerHandler

回答

2

ChannelLocal是去ATM的方式。只需在某處創建一個靜態實例,然後通過將Channel傳遞給set/get方法,從您的處理程序中訪問它。這樣你可以在你的頻道之間分享內容。

+1

這就是我所理解的(概念上或多或少),但是我還沒有找到任何關於如何做到這一點的例子。我對這些細節還是有點模糊...... –

+1

我們不再使用Apache James Protocols,但我認爲你可以從舊代碼中得到這個想法: http://svn.apache.org/viewvc /james/protocols/tags/protocols-1.5/impl/src/main/java/org/apache/james/protocols/impl/ChannelAttributeSupport.java?view=markup http://svn.apache.org/viewvc/ james/protocols/tags/protocols-1.5/impl/src/main/java/org/apache/james/protocols/impl/AbstractChannelUpstreamHandler.java?view = markup –

+0

下面是ChannelLocal的一個例子。 http://stackoverflow.com/questions/8449663/usage-of-nettys-channellocal – Veebs

2

我是不是該ChannelLocal實現與缺乏內部靜態地圖的粉絲,所以我落得這樣做是把我對象的頻道的附件現在:

ctx.getChannel().setAttachment(myobj); 

然後我做「myobj」基本上是一個上下文POJO,其中包含迄今爲止收集的有關請求的所有信息。

public class RequestContext { 
    private String foo = ""; 

    public String getFoo(){ 
     return foo; 
    } 
    public void setFoo(String foo){ 
     this.foo = foo; 
    } 

} 

RequestContext reqCtx = new RequestContext(); 
reqCtx.setFoo("Bar"); 

ctx.getChannel().setAttachment(reqCtx); 
reqCtx = (RequestContext)ctx.getChannel().getAttachment(); 

這不是優雅,但它的工作原理...

+0

是的,但附件沒有遍歷管道中的其他處理程序,這是我遇到的問題。 –

+2

Channel上的附件確實如此。我現在使用它,它工作正常。它走向渠道的任何地方。 –

0

我通過使用專用實例來撰寫每個通道的流水線傳遞信息從一個處理器到下的,並具有處理引用每個每個管道內的其他人。

信息的傳遞是舊的方式,很簡單,沒有任何問題。

+1

一個小代碼樣本會走很長的路。 –

相關問題