У меня следующая ситуация:Нетти: channel.write висит на разъединение
Новый соединительный канал открывается таким образом:
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()
и они всегда верны ...Как обойти это? Исключение не выбрасывается, и ничего действительно не происходит ... Некоторые вопросы, такие как this one и this one, показывают, что невозможно обнаружить отключение канала без биения. Но я не могу выполнить биение, потому что я не могу изменить серверную сторону.
Окружающая среда: Нетти 3, JDK 1,7