2011-12-19 12 views
2

クライアントから非同期にメッセージを送信してチャネルを閉じると、Nettyは次の例外をスローします。非同期メッセージを送信してからチャネルを閉じると、ClosedChannelExceptionが発生する

java.nio.channels.ClosedChannelException 
at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:133) 
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:324) 
at org.jboss.netty.channel.socket.nio.SocketSendBufferPool$PooledSendBuffer.transferTo(SocketSendBufferPool.java:239) 
at org.jboss.netty.channel.socket.nio.NioWorker.write0(NioWorker.java:469) 
at org.jboss.netty.channel.socket.nio.NioWorker.writeFromTaskLoop(NioWorker.java:392) 
at org.jboss.netty.channel.socket.nio.NioSocketChannel$WriteTask.run(NioSocketChannel.java:276) 
at org.jboss.netty.channel.socket.nio.NioWorker.processWriteTaskQueue(NioWorker.java:268) 
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:199) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at java.lang.Thread.run(Thread.java:662) 

次のように私の送信コードは、次のように

Channels.write(clientChannel, messageObject); 

私の近くのコードは次のとおりです。

ChannelGroupFuture future = ALL_CHANNELS.close(); 
    future.awaitUninterruptibly(); 
    if (null != clientBootstrap) { 
     clientBootstrap.releaseExternalResources(); 
    } 

は私が閉じる前にチャンネルをフラッシュするために必要なものはありますか?

答えて

0

ご迷惑をおかけして申し訳ございません。書き込みが完了した後(Veebsが示唆したように)チャンネルを閉じて、チャンネルが閉じられたときに新しい書き込みに失敗すると苦情を言いましたか?それ以上の処理が必要な場合は、返された最後の未来にChannelFutureListener.CLOSEを追加する必要があります。

希望します。

2

私は同様の問題がありました。私のための修正は、書面によって返されたChannelFutureで閉じることでした。

ChannelFuture f = clientChannel.write(messageObject); 
f.addListener(ChannelFutureListener.CLOSE); 

これはうまくいきます。

+0

優れています。これは数日間私を悩ましていた。私が見つけたNettyの例のどれもこれをしません。 – DarVar

+0

Nopeはすぐに話しました。これはうまくいかなかった。後続のメッセージ送信は、チャネルが閉じられているため失敗します。 – DarVar

+0

私は送信/受信を完了したとき、つまり最後の書き込みの後にのみチャンネルを閉じる必要があると思います。 – Veebs

関連する問題