netty повторное использование каналов

я хочу создать пул соединений, который повторно использует каналы, но я не мог понять

выполнение этого теста

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

}

Я получил ClosedChannelException во втором канале.write(request)....

Существует ли способ повторного использования каналов? или оставить канал открытым?

заранее спасибо


person sjdms265    schedule 13.11.2012    source источник


Ответы (1)


Причина, по которой вторая запись не удалась, заключается в том, что сервер закрыл соединение.

Причина, по которой сервер закрыл соединение, заключается в том, что вы не смогли добавить заголовок HTTP.

Connection: Keep-Alive

к исходному запросу.

Это необходимо для того, чтобы оставить канал открытым (что вы и хотите сделать в этом сценарии).

После закрытия канала вы должны создать новый канал. Вы не можете повторно открыть канал. ChannelFuture, возвращаемый Channel.getCloseFuture(), является окончательным (т. е. постоянным) для канала, и как только isDone() в этом будущем возвращает true, его нельзя сбросить. По этой причине закрытый канал нельзя использовать повторно.

Однако вы можете повторно использовать открытый канал столько раз, сколько вам нужно; но для этого ваше приложение должно правильно работать с протоколом HTTP.

person Kevin Sitze    schedule 14.11.2012