0

私のコードの新しいチャネルでの2番目の.writeではChannelFuture.isSuccess、書き込み操作はfalseであり、ChannelFuture.causeはですio.netty.channel.PartialFlushException: 0 out of 1 message(s) flushed。これを回避するために何をすべきか、そしてより深い根本原因をどこで探すべきか、私にはほとんどわかりません。

ChannelFuture.cause.getStackTraceStringは次のとおりです。

io.netty.channel.ChannelOutboundMessageHandlerAdapter.flush(ChannelOutboundMessageHandlerAdapter.java:118)io.netty.channel.CombinedChannelDuplexHandler.flush(CombinedChannelDuplexHandler.java:237)io.netty.channel.DefaultChannelHandlerContext.invokeFlush0(DefaultChannelHandlerContext.java:1308)io。 netty.channel.DefaultChannelHandlerContext.write0(DefaultChannelHandlerContext.java:1445)io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:1412)io.netty.channel.DefaultChannelHandlerContext.write(DefaultChannelHandlerContext.java:1034)io.netty。 channel.DefaultChannelPipeline.write(DefaultChannelPipeline.java:959)io.netty.channel.AbstractChannel.write(AbstractChannel.java:246)pipe.Broker $ writer $ .write(Broker.scala:72)pipe.Broker $ httpClientHandler.messageReceived (Broker.scala:57)パイプ。Broker $ httpClientHandler.messageReceived(Broker.scala:52)io.netty.channel.ChannelInboundMessageHandlerAdapter.inboundBufferUpdated(ChannelInboundMessageHandlerAdapter.java:104)io.netty.channel.DefaultChannelHandlerContext.invokeInboundBufferUpdated(DefaultChannelHandlerContext.java:951)io.netty.channel。 DefaultChannelHandlerContext.fireInboundBufferUpdated0(DefaultChannelHandlerContext.java:926)io.netty.channel.DefaultChannelHandlerContext.fireInboundBufferUpdated(DefaultChannelHandlerContext.java:904)io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:466)io.netty.handler。 codec.ByteToMessageDecoder.inboundBufferUpdated(ByteToMessageDecoder.java:69)io.netty.channel.ChannelInboundByteHandlerAdapter.inboundBufferUpdated(ChannelInboundByteHandlerAdapter.java:51)io.netty.channel.CombinedChannelDuplexHandler。inboundBufferUpdated(CombinedChannelDuplexHandler.java:194)io.netty.channel.DefaultChannelHandlerContext.invokeInboundBufferUpdated(DefaultChannelHandlerContext.java:951)io.netty.channel.DefaultChannelHandlerContext.fireInboundBufferUpdated0(DefaultChannelHandlerContext.java:926)io.netty.channel.DefaultChannelHandlerContext.fireInboundBuffer DefaultChannelHandlerContext.java:904)io.netty.channel.DefaultChannelPipeline.fireInboundBufferUpdated(DefaultChannelPipeline.java:909)io.netty.channel.nio.AbstractNioByteChannel $ NioByteUnsafe.read(AbstractNioByteChannel.java:115)io.netty.channel.nio。 NioEventLoop.processSelectedKey(NioEventLoop.java:401)io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:365)io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:302)io.netty。チャネル。SingleThreadEventExecutor $ 2.run(SingleThreadEventExecutor.java:110)java.lang.Thread.run(不明なソース)

チャネルの最初の.writeはうまくいきます(isSuccessはtrueであり、実際に書き込まれたメッセージは完全に宛先に到着して解析されます)。しかし、2番目の.writeは、説明されているように一貫して失敗します。

2番目の.writeは、オーバーライドされたChannelInboundMessageHandlerAdapter内から発行されます。messageReceivedメソッドは、リモートピアによる最初の.writeの受信の確認応答を受信します。

実際の書き込みを実行する私のコード(これはScalaです)は次のとおりです。

 request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"+msg)
              var writeFuture = channel.write(request).addListener(new ChannelFutureListener(){
                  def operationComplete(channelFuture: ChannelFuture){
                    if (channelFuture.isSuccess)
                        println("write finished successfully")
                    else 
                        println ("write failed: " + channelFuture.cause + "\n" + channelFuture.cause.getStackTraceString)
                  }
              })

何が問題になる可能性があり、どのように追跡する必要がありますか?

4

1 に答える 1

1

APartialFlushExceptionには、フラッシュ障害の実際の原因が含まれています。Exception.getCause()Javaが提供するメソッドを使用して取得できます。

PartialFlushException e = ...;
e.getCause(); // This will return the exception you raised.

例外の完全な情報を取得するには、例外を出力する代わりに、を呼び出す必要がありますprintStackTrace()

future.cause.printStackTrace()

連鎖例外の詳細については、このチュートリアルを参照してください。

于 2013-02-23T00:41:45.650 に答える