我有以下情況:的Netty: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表明無法檢測到沒有心跳的通道斷開連接。但是我無法實現心跳,因爲我無法更改服務器端。
環境:Netty的3,JDK 1.7