我正在开发的服务器根据从客户端收到的消息执行不同的任务,有些任务非常简单,只需要很少的时间来执行,但其他任务可能需要一段时间。
向管道添加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
)。
有没有办法根据解码的消息跳过执行处理程序?
这个问题可以概括为:是否有办法判断是否使用下一个处理程序?
感谢。
答案 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。