【问题标题】:Can a Netty NIO channel be writable but not connected?Netty NIO 通道可以写但不连接吗?
【发布时间】:2012-08-04 01:38:44
【问题描述】:

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

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

应该isWritable() == true 假设isConnected() == 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 netty


    【解决方案1】:

    可连接和可写在底层是相同的条件。确保首先测试可连接,当它触发时完成连接,如果成功则对可连接状态/事件失去所有兴趣。在连接完成之前,请勿以书面形式注册。

    【讨论】:

    • 我为isConnected() 添加了一个测试,解决了这个问题。我想我(错误地)假设如果通道未连接,则通道不可写。
    • @Dev 我不熟悉 Netty API,但在 NIO 引擎盖下,当OP_CONNECT 被触发时,您或它应该调用SocketChannel.finishConnect(),并且仅在finishConnect() 时注册OP_WRITE返回真。
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多