在我的代码中的新通道上的第二个.write上,用于写操作的ChannelFuture.isSuccess是假的,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) pipe.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(DefaultChannelHandlerContextio.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.channel.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:110) java.lang.Thread.run(未知来源)
通道上的第一个.write进行得很好(isSuccess是真的,并且书面消息完全到达目的地并在目的地解析)。但是第二个.write总是失败,正如所描述的那样。
当我的重写的ChannelInboundMessageHandlerAdapter.messageReceived方法接收到远程对等方接收到第一个.write的确认时,就会从它中发出第二个.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)
}
})问题是什么,应该如何追踪?
发布于 2013-02-23 00:41:45
PartialFlushException包含刷新失败的实际原因。您可以使用Java提供的Exception.getCause()方法获得它:
PartialFlushException e = ...;
e.getCause(); // This will return the exception you raised.要获得异常的完整信息,您必须调用printStackTrace(),而不是打印异常。
future.cause.printStackTrace()有关链接异常的详细信息,请参阅本教程。
https://stackoverflow.com/questions/14979926
复制相似问题