管道中的条件ExecutionHandler

时间:2013-01-29 22:24:54

标签: java multithreading netty pipeline

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

向管道添加ExecutionHandler似乎是复杂任务的一个很好的解决方案,但我想避免线程化简单的任务。

我的管道看起来像这样:

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

MessageEncoder返回定义所请求任务的Message对象(对于decode)。

有没有办法根据解码的消息跳过执行处理程序?
这个问题可以概括为:是否有办法判断是否使用下一个处理程序?

感谢。

2 个答案:

答案 0 :(得分:3)

您可以扩展它以覆盖其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);
    }
    ...
}

答案 1 :(得分:1)

在向上游发送消息之前,您可以从MessageDecoder内的管道中删除它(或根据需要添加它)。您还可以检查executionHandler中的消息,然后将其传递给上游。 如果您无法修改这两个文件,您可以创建另一个处理程序,根据消息类型删除executionHandler。