3

チャネルを再利用する接続プールを作成したいのですが、理解できませんでした

このテストの実行

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();

}

2番目のchannel.write(request)...でClosedChannelExceptionが発生しました。

チャネルを再利用する方法はありますか?またはチャネルを開いたままにしますか?

前もって感謝します

4

1 に答える 1

2

2 番目の書き込みが失敗した理由は、サーバーが接続を閉じたためです。

サーバーが接続を閉じた理由は、HTTP ヘッダーの追加に失敗したためです

Connection: Keep-Alive

元のリクエストに。

これは、チャネルを開いたままにしておくために必要です (これは、このシナリオで実行したいことです)。

チャネルが閉じられたら、新しいチャネルを作成する必要があります。チャンネルを再開することはできません。Channel.getCloseFuture() によって返される ChannelFuture は、チャネルに対して最終的 (つまり、定数) であり、この Future で isDone() が返さtrueれると、リセットすることはできません。これが、閉じたチャネルを再利用できない理由です。

ただし、開いているチャネルは必要に応じて何度でも再利用できます。ただし、これを実現するには、アプリケーションが HTTP プロトコルを適切に使用する必要があります。

于 2012-11-14T00:42:33.080 に答える