1

サーバー ハンドラー。受信したメッセージごとに、複数の応答があります。ビジネスロジックには、リクエストをキューに入れ、キューから削除し、リクエストを処理して応答することが含まれます。

キューの整合性を維持しながら、リクエストを非同期で処理し、非同期で応答するにはどうすればよいですか?

以下のコードは同期的に動作します。

public class TestHandler extends SimpleChannelHandler {

    @Override
    public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
        // Send greeting for a new connection.
        e.getChannel().write(
                "Welcome to " + InetAddress.getLocalHost().getHostName() + "!\r\n");
        e.getChannel().write("It is " + new Date() + " now.\r\n");

    }

    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {      
        String XMLFromClient = (String) e.getMessage() ;

        ReadXML2 rx = new ReadXML2();
        String response = null;
        response = rx.processInput(XMLFromClient);
        ChannelFuture future = e.getChannel().write(response);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
        e.getCause().printStackTrace();
        Channel ch = e.getChannel();
        ch.close();
    } 
}
4

1 に答える 1

1

Nettyでは、書き込みは常に非同期ですが、同じチャネルに書き込まれたメッセージは順番にキューに入れられます。読み取り中に非同期操作が必要な場合は、ExecutionHandlerをに追加する必要がありますChannelPipeline。順序付けが重要な場合は、OrderedMemoryAwareThreadPoolExecutor実装を使用してください。ChannelPipelineあなたはそれをあなた自身の前に追加する必要がありますTestHandler。新しいNetty4APIは、非同期パイプラインハンドラーをより適切に制御しますが、まだ開発中です。

于 2012-11-07T18:16:33.890 に答える