Java Netty NIO通道可以写但不能连接吗?

Java Netty NIO通道可以写但不能连接吗?,java,netty,Java,Netty,我有一个处理程序,它接收一个channelInterestChanged回调,然后测试该回调中通道的isWritable()方法,并在下游触发一个writeRequest事件(如果是) 有时,如果在打开通道时发生这种情况,通道会抛出异常事件,其原因为java.nio.channels.notyetConnectionedException 是否应假定iswriteable()==true已断开连接()==true还是我搞砸了 例如: @Override public void channelIn

我有一个处理程序,它接收一个
channelInterestChanged
回调,然后测试该回调中通道的
isWritable()
方法,并在下游触发一个
writeRequest
事件(如果是)

有时,如果在打开通道时发生这种情况,通道会抛出异常事件,其原因为
java.nio.channels.notyetConnectionedException

是否应假定
iswriteable()==true
已断开连接()==true还是我搞砸了

例如:

@Override
public void channelInterestChanged(ChannelHandlerContext ctx,
        ChannelStateEvent e) throws Exception {
    MyMessage msg;
    while(ctx.getChannel().isWritable()){
        msg = queue.poll();
        Channels.write(ctx, Channels.succeededFuture(ctx.getChannel()), msg);
    }
}
堆栈跟踪:

java.nio.channels.NotYetConnectedException
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.cleanUpWriteBuffer(AbstractNioWorker.java:696)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.writeFromUserCode(AbstractNioWorker.java:421)
    at org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink.eventSunk(NioClientSocketPipelineSink.java:116)
    at org.jboss.netty.channel.Channels.write(Channels.java:733)
    at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:65)
    at org.jboss.netty.channel.Channels.write(Channels.java:733)
    at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:65)
    at org.jboss.netty.channel.Channels.write(Channels.java:733)
    at org.jboss.netty.channel.Channels.write(Channels.java:694) <--- this call is guarded by `isWritable()`
    at foo.bar.MyHandler.channelInterestChanged(MyHandler.java:44) <--- My handler
    at org.jboss.netty.handler.codec.oneone.OneToOneDecoder.handleUpstream(OneToOneDecoder.java:61)
    at org.jboss.netty.channel.Channels.fireChannelInterestChanged(Channels.java:361)
    at org.jboss.netty.channel.Channels$3.run(Channels.java:349)
    at org.jboss.netty.channel.socket.ChannelRunnableWrapper.run(ChannelRunnableWrapper.java:41)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processEventQueue(AbstractNioWorker.java:373)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:254)
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35)
    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)
java.nio.channels.NotYetConnectedException
位于org.jboss.netty.channel.socket.nio.AbstractNioWorker.CleanuWriteBuffer(AbstractNioWorker.java:696)
位于org.jboss.netty.channel.socket.nio.AbstractNioWorker.writeFromUserCode(AbstractNioWorker.java:421)
位于org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink.eventsink(NioClientSocketPipelineSink.java:116)
在org.jboss.netty.channel.Channels.write上(Channels.java:733)
位于org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:65)
在org.jboss.netty.channel.Channels.write上(Channels.java:733)
位于org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:65)
在org.jboss.netty.channel.Channels.write上(Channels.java:733)

在org.jboss.netty.channel.Channels.write(Channels.java:694)可连接和可写在引擎盖下是相同的条件。确保首先测试可连接性,当它触发时,完成连接,如果成功,则对可连接状态/事件失去所有兴趣。在连接完成之前不要注册对写作的兴趣。

我为
isConnected()
添加了一个测试,解决了这个问题。我猜我(错误地)认为,如果通道没有连接,它就无法写入。@Dev我不熟悉Netty API,但在NIO的保护下,当触发
OP\u CONNECT
时,您或它应该调用
SocketChannel.finishConnect()
,并且只有注册的
OP\u WRITE
如果
finishConnect()
返回true。