发送异步消息然后关闭通道后,ClosedChannelException

时间:2011-12-19 18:24:43

标签: netty

当我从客户端异步发送消息然后关闭该频道时,Netty会抛出以下异常。

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();
    }

关闭之前,我需要做些什么才能刷新频道?

2 个答案:

答案 0 :(得分:2)

我有类似的问题。我的修复是关闭写入返回的ChannelFuture

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

希望这适合你。

答案 1 :(得分:0)

抱歉,我不明白你的问题。您现在在写入完成后关闭通道(如Veebs建议的那样),现在您抱怨因为通道关闭而无法进行新写入?如果您需要更多写操作,则需要将ChannelFutureListener.CLOSE添加到返回的最后一个未来。

希望有所帮助......