3

コールバックを受信し、そのコールバックでチャネルのメソッドを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)
4

1 に答える 1

5

接続可能と書き込み可能は、内部で同じ状態です。必ず最初に接続可能性をテストし、それが起動したら接続を完了し、成功した場合は接続可能状態/イベントへの関心をすべて失います。接続が完了するまで、書面での関心を登録しないでください。

于 2012-08-03T08:05:03.937 に答える