Apache camel ChannelHandler处理未知大小的内容
我仍然在努力使用Camel 2.16.1和Netty 4.0.33,让它们都接收自由选择长度的tcp内容。由于接收到的tcp内容大小未知,我还无法为其创建一个工作的解码器 让我用一个例子来描述我的问题。假设我有一个长度为3129字节的文件。当我将该文件nc到我的路由时,直到读取最后一个字节后,才知道大小: cat file.bin | nc localhost 10001 我的路线定义如下:Apache camel ChannelHandler处理未知大小的内容,apache-camel,netty,Apache Camel,Netty,我仍然在努力使用Camel 2.16.1和Netty 4.0.33,让它们都接收自由选择长度的tcp内容。由于接收到的tcp内容大小未知,我还无法为其创建一个工作的解码器 让我用一个例子来描述我的问题。假设我有一个长度为3129字节的文件。当我将该文件nc到我的路由时,直到读取最后一个字节后,才知道大小: cat file.bin | nc localhost 10001 我的路线定义如下: from( "netty4:tcp://127.0.0.1:10001?sync=false&a
from( "netty4:tcp://127.0.0.1:10001?sync=false&allowDefaultCodec=false&
decoder=#factory&receiveBufferSize=1000000")
.to("file:/temp/in");
工厂是这样的,因为我需要确保每个ChannelHandler只使用一次:
public class Factory implements ChannelHandlerFactory {
@Override
public ChannelHandler newChannelHandler() {
return new RawPrinterDecoder();
}
}
在我的解码器中,我有以下代码:
public class RawPrinterDecoder extends ReplayingDecoder<Void> {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in,
List<Object> out) throws Exception {
while (in.isReadable()) {
byte readByte = in.readByte();
job.addContent(readByte);
}
in.discardReadBytes();
}
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
System.out.println("Bytes in job: " + job.getSize() );
}
}
问题是我收到的不是3129字节,而是9273字节。原因是文件被分成3个1024字节的段和1个57字节的段。这些被反复传递到我的解码器,虽然我尝试在第一次使用in.discardReadBytes处理这些段后使其无效,但它们会再次处理,因此不会
段1
段2
分段3
分段4
。。。我的解码器是这样看的
段1
段1+2
段1+段2+段3
段1+段2+段3+段4
我试图通过使用检查点来解决我的问题,但是这些段仍然被重复调用
如何确保每个段只处理一次,且顺序正确?如果可以更有效地执行此操作,而不是读取单个字节,则建议是受欢迎的readableBytes始终返回2 GB,因此我无法使用它来获取字节数。由于您的服务器正在使用ByteBuffolcator,它会被分为多个段。您可以通过以下方式进行更改:
@Bean
public ChannelInitializer<SocketChannel> channelInitializer() {
return new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.config().setRecvByteBufAllocator(new FixedRecvByteBufAllocator(2048));
}
};
}
或
ByteBuf buffer = in.readBytes(in);
ByteBuf buffer = in.readSlice(in.readableBytes());