服务器处理程序的Netty异步响应

时间:2012-11-06 15:38:10

标签: java netty

服务器处理程序。对于每个收到的消息,将有多个响应。业务逻辑涉及将请求放入队列,从队列中删除,处理请求和响应。

如何异步处理请求,异步响应,同时保持队列的完整性?

以下代码的行为是同步的。

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();
    } 
}

1 个答案:

答案 0 :(得分:1)

在netty写入中始终是异步的,但写入同一通道的消息将按顺序排队。在阅读时,如果您想要异步操作,则需要向ChannelPipeline添加ExecutionHandler。如果排序很重要,那么使用OrderedMemoryAwareThreadPoolExecutor实现。您需要在自己的ChannelPipeline之前将其添加到TestHandler。新的Netty 4 API提供了对异步管道处理程序的更好控制,但它仍处于开发阶段。