Как закрыть канал при ошибке соединения, используя SimpleChannelPool в netty? - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь использовать пул соединений в netty, но у меня возникают проблемы с записью некоторых обработчиков ошибок. В моем исходном коде было что-то вроде следующего:

ChannelFuture connectFuture = bootstrap.connect(...);
connectFuture.addListener(ChannelFutureListener.CLOSE_ON_FAILURE);

Однако ChannelPool.acquire возвращает Future<Channel>. Это означает, что при сбое операции доступ к каналу отсутствует, поэтому я не знаю, как его закрыть. Важно ли закрыть сбойный канал? Я предполагаю, что он все еще может удерживать некоторые системные ресурсы, даже если он не мог подключиться.

Я думаю, что соответствующий код находится в классе netty SimpleChannelPool в notifyConnect:

    private void notifyConnect(ChannelFuture future, Promise<Channel> promise) throws Exception {
        if (future.isSuccess()) {
            Channel channel = future.channel();
            handler.channelAcquired(channel);
            if (!promise.trySuccess(channel)) {
                // Promise was completed in the meantime (like cancelled), just release the channel again
                release(channel);
            }
        } else {
            promise.tryFailure(future.cause());
        }
    }

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

1 Ответ

0 голосов
/ 02 апреля 2020

Это оказалось очень просто, вам просто нужно переопределить SimpleChannelPool.connectChannel () `и добавить туда слушателя.

...