Netty 4 io.Netty.channel.PartialFlush写入后异常

Netty 4 io.Netty.channel.PartialFlush写入后异常,netty,Netty,秒。在“我的代码”中的新频道上写入,写入操作的ChannelFuture.issucess为false,而ChannelFuture.cause为io.netty.channel.PartialFlushException:刷新了0/1条消息。我不知道应该做些什么来避免这种情况,也不知道从哪里寻找更深层次的根源 ChannelFuture.cause.getStackTraceString是: io.netty.channel.ChannelOutboundMessageHandlerAdapt

秒。在“我的代码”中的新频道上写入,写入操作的
ChannelFuture.issucess
为false,而
ChannelFuture.cause
io.netty.channel.PartialFlushException:刷新了0/1条消息
。我不知道应该做些什么来避免这种情况,也不知道从哪里寻找更深层次的根源

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) 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.fireInboundBufferUpdated(DefaultChannelHandlerContext.java:904) io.netty.channel.DefaultChannelPipeline.fireInboundBufferUpdated(DefaultChannelPipeline.java:909) io.netty.channel.nio.AbstractNioByteChannel$niobyteensafe.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.channel.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:110) java.lang.Thread.run(未知源)

第一个.write在通道上运行得很好(isSuccess是真的,而且写的消息确实完美地到达并解析到了目的地)。但是,第二个.write始终失败

第二个.write是从被重写的ChannelInboundMessageHandlerAdapter中发出的。方法,一旦它接收到远程对等方发送的第一个.write的接收确认

我执行实际写入(这是Scala)的代码是:


问题可能是什么?应如何追踪

A
partialflush异常
包含刷新失败的实际原因。您可以使用Java提供的
Exception.getCause()
方法获得它:

PartialFlushException e = ...;
e.getCause(); // This will return the exception you raised.
要获取异常的完整信息,您必须调用
printStackTrace()
,而不是打印异常


有关链接异常的更多信息,请参阅。

谢谢。我的代码当前正在使用。原因在频道future上获取原因文本。这似乎返回PartialFlushException的原因文本“已刷新1条消息中的0条”。我不知道如何把这解释为根本原因。我会错过什么?顺便说一句,尝试在try块中包装写操作不会在catch块中捕获异常,这可能是由于写的异步性质。所以我只是假设未来频道上出现的.cause是获取异常的方式,实际上它是一个PartialFlushException,带有我刚才提到的原因文本。问题是,原因文本很难以任何可操作的方式进行解释。PartialFlushException.getCause()将返回另一个作为根本原因的异常。谢谢,使用channelFuture.cause.getCause显然更深入一层,原因显示为“意外消息类型:DefaultHttpRequest”。考虑到管道纯粹是一个HttpRequestEncoder,还不确定为什么该类型的对象无效/预期!但这已经是一个不同主题的问题了。。。我要把这个关了。如果您想评论为什么这里的Http管道上不需要HttpRequestEncoder,请不要犹豫;)请注意,接受的答案建议通过使用更详细的printStackTrace方法或将来使用.cause.getCause来查看故障的更“根本”原因。它回答了跟踪问题的需要(尽管尚未找到根本问题的解决方案-除非在上回答)
PartialFlushException e = ...;
e.getCause(); // This will return the exception you raised.
future.cause.printStackTrace()