我正在使用 netty 3.3.1 开发自定义 HTTP 服务器。
我需要实现这样的东西
- HTTP 服务器接收请求
- HTTP 服务器解析它并调用 HTTP 请求作为其他机器的客户端
- HTTP Server 等待(2)中发送的请求的响应
- HTTP 服务器根据 (3) 中收到的内容发送对 (1) 请求的响应
这意味着客户端请求 (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()
上面示例中的命令在messageReceived
我的 herver 处理程序的函数中调用。
所以它变成了异步的并且避免了 await* 函数。请求被正确调用。但是 - 因为我不知道的原因 - 这条线
bootstrap.releaseExternalResources(); // DOES NOT WORK?
不起作用。它抛出一个异常,说我无法杀死我当前正在使用的线程(这听起来很合理,但仍然没有给我一个答案,如何以不同的方式做到这一点)。
我也不确定这是正确的方法吗?
也许您可以推荐一个netty中此类事件编程技术的教程?通常,如何处理一些必须按指定顺序调用并相互等待的异步请求?
谢谢,