我正在使用netty 3.3.1开发自定义HTTP服务器。
我需要实现类似这样的东西
这意味着客户端请求(2)必须表现为同步。
我写的内容基于HttpSnoopClient example,但它不起作用,因为我收到了
java.lang.IllegalStateException:
await*() in I/O thread causes a dead lock or sudden performance drop. Use addListener() instead or call await*() from a different thread.
我从上面提到的例子中重构了the code,现在看起来更像是这样(从HttpSnoopClient的第7f行开始):
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
future.addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
if (!future.isSuccess()) {
System.err.println("Cannot connect");
future.getCause().printStackTrace();
bootstrap.releaseExternalResources();
return;
}
System.err.println("Connected");
Channel channel = future.getChannel();
// Send the HTTP request.
channel.write(request);
channel.close();
// Wait for the server to close the connection.
channel.getCloseFuture().addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
System.err.println("Disconnected");
bootstrap.releaseExternalResources(); // DOES NOT WORK?
}
});
}
});
}
}
在myver处理程序的run()
函数中调用上例中的messageReceived
命令。
因此它变得异步并避免等待*函数。请求被正确调用。但是 - 因为我知道的原因 - 行
bootstrap.releaseExternalResources(); // DOES NOT WORK?
不起作用。它抛出一个异常,说我无法杀死我正在使用的线程(这听起来很合理,但仍然没有给我一个答案,如何以不同的方式做到这一点)。
我也不确定这是一种正确的方法吗?
也许你可以在netty中推荐这样的事件编程技巧的教程?如何处理 - 一般情况下 - 与一些必须以指定顺序调用并等待彼此的异步请求?
谢谢,
答案 0 :(得分:1)
如果您真的想在关闭时释放引导程序,可以这样做:
channel.getCloseFuture().addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
System.err.println("Disconnected");
new Thread(new Runnable() {
public void run() {
bootstrap.releaseExternalResources();
}
}).start();
}
});