我想创建一个处理程序管道,例如:
public ChannelPipeline getPipeline() throws Exception
{
return Channels.pipeline(
new ObjectEncoder(),
new ObjectDecoder(),
new AuthenticationServerHandler(),
new BusinessLogicServerHandler());
}
这里的关键是我希望AuthenticationServerHandler
能够将登录信息传递给BusinessLogicServerHandler
。
我确实理解您可以使用Attachment
,但是只存储该处理程序的信息,管道中的其他处理程序无法访问它。我还注意到有一些名为ChannelLocal
的东西可以解决这个问题,但我找不到任何有关如何使用它的真实信息。我所见过的是人们为它创建一个静态实例,但是如何检索和访问另一个处理程序中的信息?假设这是正确的方法。
我的问题是:如何在同一管道中的处理程序之间传递信息。在上面的示例中,如何将登录凭据从AuthenticationServerHandler
传递到BusinessLogicServerHandler
?
答案 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)
我将信息从一个处理程序传递到下一个处理程序,方法是使用专用实例为每个通道组成管道,并让处理程序在每个管道中引用彼此。
信息的传递是老式的,非常简单,没有任何问题。