0

Netty サーバーは、ChannelHandler の exceptionCaught メソッドからクライアントにエラー応答を返します。クライアントが消失した場合、これにより無限再帰が発生します。スタック トレースのスニペットは次のとおりです。

at org.jboss.netty.channel.socket.nio.AbstractNioWorker.cleanUpWriteBuffer(AbstractNioWorker.java:778) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.writeFromUserCode(AbstractNioWorker.java:501) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:129) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:66) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.Channels.write(Channels.java:733) [netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.Channels.write(Channels.java:694) [netty-3.5.7.Final.jar:na]
at com.inversoft.cleanspeak.store.content.server.netty.ContentStoreChannelHandler.exceptionCaught(ContentStoreChannelHandler.java:68) ~[cleanspeak-content-store-2.3.jar:2.3]
at org.jboss.netty.handler.codec.frame.FrameDecoder.exceptionCaught(FrameDecoder.java:378) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:533) [netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.cleanUpWriteBuffer(AbstractNioWorker.java:790) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.writeFromUserCode(AbstractNioWorker.java:501) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:129) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:66) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.Channels.write(Channels.java:733) [netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.Channels.write(Channels.java:694) [netty-3.5.7.Final.jar:na]
at com.inversoft.cleanspeak.store.content.server.netty.ContentStoreChannelHandler.exceptionCaught(ContentStoreChannelHandler.java:68) ~[cleanspeak-content-store-2.3.jar:2.3]
at org.jboss.netty.handler.codec.frame.FrameDecoder.exceptionCaught(FrameDecoder.java:378) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:533) [netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.cleanUpWriteBuffer(AbstractNioWorker.java:790) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.writeFromUserCode(AbstractNioWorker.java:501) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.handleAcceptedSocket(NioServerSocketPipelineSink.java:129) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink.eventSunk(NioServerSocketPipelineSink.java:66) ~[netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.Channels.write(Channels.java:733) [netty-3.5.7.Final.jar:na]
at org.jboss.netty.channel.Channels.write(Channels.java:694) [netty-3.5.7.Final.jar:na]

私の質問は、私の exceptionCaught メソッドにクライアントがまだ存在するかどうかをテストするための最良の方法は何ですか? e.getChannel().isOpen() は機能しますか?

4

1 に答える 1

1

channel.isConnected()で確認できますが、書き込みは非同期であるため、これは機能しない可能性があり、実際の書き込みが発生したときにtrueではなくなる可能性があります。私がほとんどの場合にすることはそのようなものです:

Channel channel = ...
channel.write(data).addListener(ChannelFutureListener.CLOSE);

これにより、書き込みの試行後にチャネルが確実に閉じられます。

于 2012-10-16T04:46:44.587 に答える