RemoteFileTemplate读取不完整的文件?

时间:2016-04-01 09:13:18

标签: java spring spring-integration

我有以下测试,它将文件上传到嵌入式apache ftp服务器,然后检查文件是否正确上传。

@Test
public void testUploadFile() {
    String fileName = "test.txt";
    ftpUploader.upload("/data/" + fileName);
    RemoteFileTemplate<FTPFile> template = new RemoteFileTemplate<>(this.ftpSessionFactory);
    FTPFile[] files = template.execute(session -> session.list(fileName));
    assertThat(files).hasSize(1);
    assertThat(files[0].getSize()).isEqualTo(FILE_CONTENT_SIZE);
}

我正在使用Spring Integration。通过RemoteFileTemplate我知道文件是否存在且大小正确。如果我在我的IDE中执行此测试它工作正常。包括所有测试的maven构建也可以。但是,在Jenkins服务器上,第二个断言失败

org.junit.ComparisonFailure: expected:<2[318796]L> but was:<2[290518]L>

可能是什么原因?模板是否下载文件,即使它没有完全上传?实际上情况并非如此,因为只要仍然写入,ftpUploader会将结尾.writing附加到文件中。 FtpUpload如下所示

 @MessagingGateway
public interface FtpUpload {

    @Gateway(requestChannel = "ftpUploadChannel")
    void upload(String fileName);
}

@Bean
IntegrationFlow upload() {
    return IntegrationFlows.from("ftpUploadChannel")
            .<String, File>transform(fileName -> new File(this.getClass().getResource(fileName).getFile()))
            .handle(Ftp.outboundAdapter(ftpSessionFactory())
                            .remoteDirectory(ftpRemoteDir)
                            .autoCreateDirectory(true)
                            .useTemporaryFileName(true)
            )
            .get();
}

1 个答案:

答案 0 :(得分:0)

大多数FTP客户端默认使用ASCII模式传输文件。在此模式下,换行符将被更改。因此,在您的情况下,在不同环境中运行时文件大小会发生变化。最可能的原因是在一个环境中换行符。