[英]Netty 4: how to manually invoke handlers?
情况是: DelimiterBasedFrameDecoder extends ByteToMessageDecoder
,而ByteToMessageDecoder
确实将未处理的字节保留在称为cumulation
的ByteBuf
。 我想在另一个处理程序中手动调用此处理程序以清空此cumulation
ByteBuf
。
我试过的
DelimiterBasedFrameDecoder frameDecoder = (DelimiterBasedFrameDecoder) inboundChannel.pipeline().get("frameDecoder");
frameDecoder.channelRead(ctx, Unpooled.EMPTY_BUFFER);
问题:我尝试的方法不起作用,因为没有下一个处理程序,因此Netty告诉我字节丢失了:
在流水线的末尾丢弃的入站消息UnpooledHeapByteBuf(ridx:0,widx:57,cap:57)。 请检查您的管道配置。
您可以将处理程序包装在EmbeddedChannel中,并使用writeInbound()和readInbound()。 查看我们的单元测试以获取用法示例以及javadocs。
诺曼(Norman)使我走上了正确的道路,但这是我需要做的事情:
PublicCumulationDelimiterBasedFrameDecoder frameDecoder = (PublicCumulationDelimiterBasedFrameDecoder) cp.get("frameDecoder");
ByteBuf bytesNotProcessed = frameDecoder.internalBuffer();
if (bytesNotProcessed != Unpooled.EMPTY_BUFFER) { PublicCumulationDelimiterBasedFrameDecoder tmpDelimiterBasedFrameDecoder = new PublicCumulationDelimiterBasedFrameDecoder(2048, false, true, Unpooled.wrappedBuffer(new byte[] { 0x03 }));
EmbeddedChannel ec = new EmbeddedChannel(tmpDelimiterBasedFrameDecoder, ... other handlers...);
ByteBuf wrapper = Unpooled.buffer();
wrapper.writeBytes(bytesNotProcessed);
ec.writeInbound(wrapper);// make it process the bytes
// put the remaining bytes (if any) back into the original buffer
bytesNotProcessed.clear();
bytesNotProcessed.writeBytes(tmpDelimiterBasedFrameDecoder.internalBuffer());
}
其中PublicCumulationDelimiterBasedFrameDecoder
就是这样:
public class PublicCumulationDelimiterBasedFrameDecoder extends DelimiterBasedFrameDecoder {
public PublicCumulationDelimiterBasedFrameDecoder(int maxFrameLength, boolean stripDelimiter, boolean failFast, ByteBuf delimiter) {
super(maxFrameLength, stripDelimiter, failFast, delimiter);
}
public ByteBuf internalBuffer() {
return super.internalBuffer();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.