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()