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はdecode、要求されたタスクを定義するMessageオブジェクト(for)を返します。

デコードされたメッセージに基づいて実行ハンドラーをスキップする方法はありますか?
質問は次のように一般化できます。次のハンドラーが使用されるかどうかを条件付ける方法はありますか?

ありがとう。

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内のメッセージを確認して、アップストリームに渡すこともできます。これらの2つのファイルを変更できない場合は、メッセージタイプに基づいてexecutionHandlerを削除する別のハンドラーを作成できます。

于 2013-01-29T23:49:57.527 に答える