1

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

将 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 对象(for decode),它定义了请求的任务。

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

谢谢。

4

2 回答 2

3

您可以扩展它以覆盖其拦截上游事件并调用其消息符合您的条件的s 的方法,而不是按ExecutionHandler原样使用。所有其他事件都可以由via处理。那是:handlerUpstream()ctx.sendUpstream(e)MessageEventExecutionHandlersuper.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);
    }
    ...
}
于 2013-01-30T05:39:15.437 回答
1

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

于 2013-01-29T23:49:57.527 回答