[英]How to call properly HTTP client from HTTP server request handler in netty?
I am developing custom HTTP server with.netty 3.3.1.我正在使用 .netty 3.3.1 开发自定义 HTTP 服务器。
I need to implement something like this我需要实现这样的东西
It means that client request (2) has to behave as synchronous.这意味着客户端请求 (2) 必须表现为同步。
What I wrote is based on HttpSnoopClient example but it does not work, because I receive我写的是基于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.
I've refactored the code from the example mentioned above and now it looks more less like this (starting from line 7f of HttpSnoopClient):我重构了上面提到的示例中的代码,现在它看起来不像这样(从 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?
}
});
}
});
}
}
The run()
command from the above example is invoked in the messageReceived
function of my herver handler.上例中的
run()
命令在我的 herver 处理程序的messageReceived
function 中被调用。
So it became asynchronous and avoid await* functions.所以它变成了异步的并且避免了 await* 函数。 Request is invoked properly.
正确调用请求。 But - for uknown reason for me - the line
但是-出于我不知道的原因-这条线
bootstrap.releaseExternalResources(); // DOES NOT WORK?
does not work.不起作用。 It throws an exception saying that I cannot kill the thread I am currently using (which sounds reasonable, but still does not give me an answer how to do that in a different way).
它抛出一个异常,说我无法终止我当前正在使用的线程(这听起来很合理,但仍然没有给我一个如何以不同方式做到这一点的答案)。
I am also not sure is this a correct approach?我也不确定这是正确的方法吗?
Maybe you can recommend a tutorial of such event programming techniques in.netty?也许你可以在.netty 中推荐一个此类事件编程技术的教程? How to deal - in general - with a few asynchronous requests that has to be invoked in specified order and wait for each other?
通常如何处理一些必须按指定顺序调用并相互等待的异步请求?
Thank you,谢谢,
If you really want to release the bootstrap on close you can do it like this:如果你真的想在关闭时释放引导程序,你可以这样做:
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.