netty 传输处理链中 如何处理中间的传递消息

xinglu 发布于 2012/02/20 16:57
阅读 5K+
收藏 1

各位老大,小弟初学netty,遇到这么一个问题:

netty的一个channel中假如设置了上行处理器handlerA和handlerB, 假如A处理完是要丢给B继续处理的,但A处理完后的结果是一个自定义的Bean,处理器B需要的是这个Bean的内容,而不是原有event.getMessage()对象,请问如果把这个自定义的bean传给处理器B,是否需要重新new一个MessageEvent,然后调用ChannelHandlerContext的sendUpstream进行新的传递?

我觉得这种需求挺普遍的,但总找不到合适的例子,是否是我对用法理解有误?

加载中
0
JavaGG
JavaGG
    handler一般我们就只用一个,你可以加上Decoder的数,其实二个handler没有必要,handler都是你自己的业务,你喜欢怎调用都可以
0
ashray
ashray
(Bean)event.getMessage()


0
xinglu
xinglu

引用来自“JavaGG”的答案

    handler一般我们就只用一个,你可以加上Decoder的数,其实二个handler没有必要,handler都是你自己的业务,你喜欢怎调用都可以
看了好多netty的官方例子,确实,handler大部分就一个,在其内部自己再实现调用逻辑就行了,没必要把自己的业务调用逻辑强加给netty, netty只不过是个IO连接器,既然已经把消息完全接收了,就应该跳出netty的框架实现自己的代码了.
我先这样说服自己...呵呵
其实我那边也不是什么正式的业务调用逻辑,只不过把zip数据解压出来,然后md5校验,然后des解密,我以前是想把这些都放到netty的handler里面,应该是我理解错了
0
三月鸟
三月鸟

有办法的,按我的理解, 楼主应该是用两个handdler,一个用来解压,校验,解密,另外一个用来处理业务逻辑。

我以前通过ChannelHandlerContext 中的setAttachment  ,  getAttachment来传递Bean,这样可以实现handler直间的对象传递

0
xinglu
xinglu

引用来自“三月鸟”的答案

有办法的,按我的理解, 楼主应该是用两个handdler,一个用来解压,校验,解密,另外一个用来处理业务逻辑。

我以前通过ChannelHandlerContext 中的setAttachment  ,  getAttachment来传递Bean,这样可以实现handler直间的对象传递

确实是个好方法,但有点偏离netty的设计,attachement,应该是用于类似参数或者辅助性的数据,而不是消息的主体.如果用attachement来传递转换后的消息,总感觉有点怪怪的
0
m
my_corner

引用来自“xinglu”的答案

引用来自“JavaGG”的答案

    handler一般我们就只用一个,你可以加上Decoder的数,其实二个handler没有必要,handler都是你自己的业务,你喜欢怎调用都可以
看了好多netty的官方例子,确实,handler大部分就一个,在其内部自己再实现调用逻辑就行了,没必要把自己的业务调用逻辑强加给netty, netty只不过是个IO连接器,既然已经把消息完全接收了,就应该跳出netty的框架实现自己的代码了.
我先这样说服自己...呵呵
其实我那边也不是什么正式的业务调用逻辑,只不过把zip数据解压出来,然后md5校验,然后des解密,我以前是想把这些都放到netty的handler里面,应该是我理解错了
请教:怎么把收netty收到的消息,跳出netty的框架实现自己的代码?我在handler中收到了server端返回的数据,怎么把这个数据传递给请求的调用者呢?
0
HuaChen
HuaChen
Overriding the handleUpstream method

You can override the handleUpstream method just like overriding an ordinary Java method. Please make sure to call super.handleUpstream() so that other handler methods are invoked properly:

public class MyChannelHandler extends SimpleChannelUpstreamHandler {

     @Override
     public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {

         // Log all channel state changes.
         if (e instanceof ChannelStateEvent) {
             logger.info("Channel state changed: " + e);
         }

         super.handleUpstream(ctx, e);
     }
 }

 

以上代码是 netty官方网站中 SimpleChannelUpstreamHandler 类的介绍信息中的。

根据最开始的一段,意思应该也可以 用几个handler的嘛。  netty 应该是 handler 等同于 mina 中的 hangder+filter 的功能吧。

0
HuaChen
HuaChen
 Please make sure to call  super.handleUpstream()  so that other handler methods are invoked properly:
0
HuaChen
HuaChen
是这句话,刚才提交时被截取了。
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部