У меня следующая ситуация:
Новое подключение канала открывается таким образом:
ClientBootstrap bootstrap = new ClientBootstrap(
new OioClientSocketChannelFactory(Executors.newCachedThreadPool()));
icapClientChannelPipeline = new ICAPClientChannelPipeline();
bootstrap.setPipelineFactory(icapClientChannelPipeline);
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
channel = future.awaitUninterruptibly().getChannel();
Это работает, как и ожидалось.
Материал записывается на канал следующим образом:
channel.write(chunk)
Это также работает, как и ожидалось, когда соединение с сервером все еще активно. Но если сервер выходит из строя (машина отключается), вызов зависает и не возвращается.
Я подтвердил это, добавив операторы журнала до и после файла channel.write(chunk)
. Когда соединение разрывается, отображается только предыдущая запись журнала.
Чем это вызвано? Я думал, что все эти вызовы асинхронны и немедленно возвращаются? Я также пробовал с NioClientSocketChannelFactory, такое же поведение.
Я пытался использовать
channel.getCloseFuture()
, но слушатель никогда не вызывается, я пытался проверить канал перед записью с помощьюchannel.isOpen()
,channel.isConnected()
иchannel.isWritable()
, и они всегда верны...Как обойти это? Никаких исключений не выдается, и на самом деле ничего не происходит... Некоторые вопросы, такие как этот и это указывают, что невозможно обнаружить отключение канала без сердцебиения. Но я не могу реализовать сердцебиение, потому что не могу изменить серверную часть.
Среда: Netty 3, JDK 1.7