我想创建一个重用频道但我无法弄清楚的连接池
执行此测试
public void test() {
ClientBootstrap client = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
client.setPipelineFactory(new ClientPipelineFactory());
// Connect to server, wait till connection is established, get channel to write to
Channel channel = client.connect(new InetSocketAddress("192.168.252.152", 8080)).awaitUninterruptibly().getChannel();
{
// Writing request to channel and wait till channel is closed from server
HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "test");
String xml = "xml document here";
ChannelBuffer buffer = ChannelBuffers.copiedBuffer(msgXml, Charset.defaultCharset());
request.addHeader(HttpHeaders.Names.CONTENT_LENGTH, buffer.readableBytes());
request.addHeader(HttpHeaders.Names.CONTENT_TYPE, "application/xml");
request.setContent(buffer);
channel.write(request).awaitUninterruptibly().getChannel().getCloseFuture().awaitUninterruptibly();
channel.write(request).awaitUninterruptibly().getChannel().getCloseFuture().awaitUninterruptibly();
}
client.releaseExternalResources();
}
我在第二个channel.write(request)....
中遇到了ClosedChannelException是否存在重用频道的方法?或保持频道开放?
提前致谢
答案 0 :(得分:2)
第二次写入失败的原因是服务器关闭了连接。
服务器关闭连接的原因是您无法添加HTTP标头
Connection: Keep-Alive
原始请求。
这是打开频道所必需的(这是您在这种情况下想要做的事情)。
频道关闭后,必须创建新频道。您无法重新开启该频道。 Channel.getCloseFuture()返回的ChannelFuture对于通道是最终的(即,常量),并且在此未来的一次isDone()返回true
它不能被重置。这就是无法重复使用封闭渠道的原因。
但是,您可以根据需要多次重复使用开放频道;但是你的应用程序必须正确地谈论HTTP协议才能实现这一目标。