Netty - 如何在同一管道中的处理程序之间传递信息

时间:2012-01-23 18:12:16

标签: java networking nio netty

我想创建一个处理程序管道,例如:

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

这里的关键是我希望AuthenticationServerHandler能够将登录信息传递给BusinessLogicServerHandler

我确实理解您可以使用Attachment,但是只存储该处理程序的信息,管道中的其他处理程序无法访问它。我还注意到有一些名为ChannelLocal的东西可以解决这个问题,但我找不到任何有关如何使用它的真实信息。我所见过的是人们为它创建一个静态实例,但是如何检索和访问另一个处理程序中的信息?假设这是正确的方法。

我的问题是:如何在同一管道中的处理程序之间传递信息。在上面的示例中,如何将登录凭据从AuthenticationServerHandler传递到BusinessLogicServerHandler

3 个答案:

答案 0 :(得分:2)

ChannelLocal是通往大气的方式。只需在某处创建一个静态实例,然后通过将Channel传递给set / get方法从处理程序中访问它。这样您就可以在频道之间分享内容。

答案 1 :(得分:2)

由于缺少内部静态地图,我不是ChannelLocal实现的粉丝,所以我最终做的就是将我的对象暂时放在Channel的附件上:

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(); 

它不优雅,但它有效......

答案 2 :(得分:0)

我将信息从一个处理程序传递到下一个处理程序,方法是使用专用实例为每个通道组成管道,并让处理程序在每个管道中引用彼此。

信息的传递是老式的,非常简单,没有任何问题。