Apache camel ChannelHandler处理未知大小的内容

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

我仍然在努力使用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&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());