ClosedChannelException после отправки асинхронного сообщения и последующего закрытия канала - PullRequest
2 голосов
/ 19 декабря 2011

Нетти выдает следующее исключение, когда я асинхронно отправляю сообщение от своего клиента и затем закрываю канал.

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 ]

2 голосов
/ 20 декабря 2011

У меня была похожая проблема.Для меня исправлением было закрытие ChannelFuture, возвращенного записью.

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

Надеюсь, это работает для вас.

0 голосов
/ 20 декабря 2011

Извините, я не понимаю вашу проблему. Теперь вы закрываете канал после того, как запись завершена (как предложил Вибс), и теперь вы жалуетесь, что не удается выполнить новые записи, так как канал закрыт? Если вам нужно больше, чем операция записи, вам нужно добавить ChannelFutureListener.CLOSE в последнее возвращенное будущее.

Надеюсь, это поможет ..

...