私のコードの新しいチャネルでの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)
}
})
何が問題になる可能性があり、どのように追跡する必要がありますか?