Spring集成 - TCP出站通道在每行末尾添加不需要的CRLF

时间:2017-07-05 08:00:01

标签: spring tcp spring-integration tcpchannel

我正在使用以下代码读取大文件,并通过缓冲区通过TCP连接缓冲区发送文件内容。在每次发送结束时,TCP通道都会添加一个CRLF字符。除非我添加它,否则我不希望它出现在结果中。

        final int BUFFER_SIZE = 65536;
    long bytesToSkip = 0;
    byte[] buffer = new byte[BUFFER_SIZE];

    try (RandomAccessFile rand = new RandomAccessFile(new File(requestModel.getFilePath()), "r");
    ) {

        rand.seek(bytesToSkip);
        while ((read = rand.read(buffer)) != -1) {

            MessageBuilder mb = MessageBuilder.withPayload(buffer).setHeaderIfAbsent(IpHeaders.CONNECTION_ID, connectionId);
            outMsgChannel.send(mb.build())

            buffer = new byte[BUFFER_SIZE];
        }
    }
    catch(Exceptions .............. 

添加新行的示例输出。 (两个缓冲区都很大。我只提到了在每个缓冲区末尾引起问题的行)

Buffer One包含

  
    

一只快速的棕色狐狸跳过懒狗

  
     

一只快速的棕色狐狸跳过来   懒狗

     
    

快速的棕色狐狸跳过

  

缓冲区二包含

  

懒狗

如果没有不需要的CRLF,那么我就不会在输出中遇到单行分割为2的问题。我想在文件所在的位置只有新行。

1 个答案:

答案 0 :(得分:2)

请参阅the documentation

  

TCP是一种流媒体协议;这意味着必须为通过TCP传输的数据提供一些结构,因此接收器可以将数据划分为离散消息。连接工厂配置为使用(反)序列化器在消息有效负载和通过TCP发送的位之间进行转换。这是通过分别为入站和出站消息提供解串器和串行器来实现的。提供了许多标准(de)序列化器。

     

ByteArrayCrlfSerializer,将字节数组转换为字节流,然后是回车符和换行符(\r\n)。这是默认(de)序列化程序,可以与telnet一起用作客户端,例如。

     

...

您需要一些方法来了解邮件何时完成 - 底层网络可能会将您的邮件打包,以便以邮件方式接收邮件。

ByteArrayRawSerializer不会在邮件中添加任何字符;它可能会满足您的需求。在阅读侧使用时,它使用套接字EOF来指示消息已完成。