在管道条件ExecutionHandler(Conditional ExecutionHandler

2019-10-17 15:33发布

我开发的服务器有不同的任务,以从客户端接收的消息来执行,有些任务是非常简单,只需要很少的时间来执行,但其他可能需要一段时间。

添加一个ExecutionHandler的管道似乎是复杂的任务,一个好的解决办法,但我想避免穿简单的任务。

我的管道是这样的:

pipeline.addLast("decoder", new MessageDecoder());
pipeline.addLast("encoder", new MessageEncoder());
pipeline.addLast("executor", this.executionHandler);
pipeline.addLast("handler", new ServerHandler(this.networkingListener));

其中MessageEncoder,具体返回一个消息对象( decode ),其限定所请求的任务。

有没有办法跳过基于解码后的信息执行处理程序?
这个问题可以概括为:有没有办法来调节下一个处理程序是否会被使用?

谢谢。

Answer 1:

代替使用ExecutionHandler作为是,可以延长它可用于覆盖其handlerUpstream()方法来拦截上游事件并调用ctx.sendUpstream(e)MessageEvent (胡)的消息符合指定准则。 所有其他事件可以被处理ExecutionHandler通过super.sendUpstream(e) 那是:

public class MyExecutionHandler extends ExecutionHandler {
    public void handleUpstream(ctx, evt) throws Exception {
        if (evt instanceof MessageEvent) {
            Object msg = ((MessageEvent) evt).getMessage();
            if (msg instanceof ExecutionSkippable) {
                ctx.sendUpstream(evt);
                return;
            }
        }

        super.handleUpstream(evt);
    }
    ...
}


Answer 2:

你可以将其删除(或添加在需要时进行)从MessageDecoder内部管道上游您发送消息前。 您也可以检查您的邮件里面executionHandler,只是通过它的上游。 如果你不能修改这两个文件,你可以创建另一个处理程序根据消息类型从而消除executionHandler。



文章来源: Conditional ExecutionHandler in pipeline