![](/img/trans.png)
[英]How does a http client associate an http response with a request (with Netty) or in general?
[英]How to call properly HTTP client from HTTP server request handler in netty?
我正在使用 .netty 3.3.1 开发自定义 HTTP 服务器。
我需要实现这样的东西
这意味着客户端请求 (2) 必须表现为同步。
我写的是基于HttpSnoopClient 示例,但它不起作用,因为我收到
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.
我重构了上面提到的示例中的代码,现在它看起来不像这样(从 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?
}
});
}
});
}
}
上例中的run()
命令在我的 herver 处理程序的messageReceived
function 中被调用。
所以它变成了异步的并且避免了 await* 函数。 正确调用请求。 但是-出于我不知道的原因-这条线
bootstrap.releaseExternalResources(); // DOES NOT WORK?
不起作用。 它抛出一个异常,说我无法终止我当前正在使用的线程(这听起来很合理,但仍然没有给我一个如何以不同方式做到这一点的答案)。
我也不确定这是正确的方法吗?
也许你可以在.netty 中推荐一个此类事件编程技术的教程? 通常如何处理一些必须按指定顺序调用并相互等待的异步请求?
谢谢,
如果你真的想在关闭时释放引导程序,你可以这样做:
channel.getCloseFuture().addListener(new ChannelFutureListener() {
public void operationComplete(ChannelFuture future) {
System.err.println("Disconnected");
new Thread(new Runnable() {
public void run() {
bootstrap.releaseExternalResources();
}
}).start();
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.