服务器处理程序。对于每个收到的消息,将有多个响应。业务逻辑涉及将请求放入队列,从队列中删除,处理请求和响应。
如何异步处理请求,异步响应,同时保持队列的完整性?
以下代码的行为是同步的。
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();
}
}
答案 0 :(得分:1)
在netty写入中始终是异步的,但写入同一通道的消息将按顺序排队。在阅读时,如果您想要异步操作,则需要向ChannelPipeline
添加ExecutionHandler。如果排序很重要,那么使用OrderedMemoryAwareThreadPoolExecutor实现。您需要在自己的ChannelPipeline
之前将其添加到TestHandler
。新的Netty 4 API提供了对异步管道处理程序的更好控制,但它仍处于开发阶段。