此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

版本 4.3 引入了流入站通道适配器。 此适配器生成具有有效负载类型的消息,允许在不写入 本地文件系统。 由于会话保持打开状态,因此使用应用程序负责在文件已关闭会话时关闭会话 消耗。 会话在标头 () 中提供。 标准框架组件(如 和 )会自动关闭会话。 有关这些组件的更多信息,请参阅文件拆分器流转换器。 以下示例演示如何配置:InputStreamcloseableResourceIntegrationMessageHeaderAccessor.CLOSEABLE_RESOURCEFileSplitterStreamTransformerinbound-streaming-channel-adapterSpring中文文档

<int-ftp:inbound-streaming-channel-adapter id="ftpInbound"
            channel="ftpChannel"
            session-factory="sessionFactory"
            filename-pattern="*.txt"
            filename-regex=".*\.txt"
            filter="filter"
            filter-expression="@myFilterBean.check(#root)"
            remote-file-separator="/"
            comparator="comparator"
            max-fetch-size="1"
            remote-directory-expression="'foo/bar'">
        <int:poller fixed-rate="1000" />
</int-ftp:inbound-streaming-channel-adapter>

只允许使用 、 、 或 之一。filename-patternfilename-regexfilterfilter-expressionSpring中文文档

从 5.0 版开始,默认情况下,适配器会根据 in-memory 来防止远程文件的重复。 默认情况下,此筛选器也与文件名模式(或正则表达式)一起应用。 如果需要允许重复项,可以使用 . 任何其他用例都可以由 (或 ) 处理。 Java 配置(在本文档后面)展示了一种在处理后删除远程文件以避免重复的技术。FtpStreamingMessageSourceFtpPersistentAcceptOnceFileListFilterSimpleMetadataStoreAcceptAllFileListFilterCompositeFileListFilterChainFileListFilter

有关 及其使用方式的详细信息,请参阅远程持久性文件列表筛选器FtpPersistentAcceptOnceFileListFilterSpring中文文档

当需要提取时,使用该属性限制每次轮询中提取的文件数。 将其设置为在群集环境中运行时使用持久性筛选器。 有关详细信息,请参阅入站通道适配器:控制远程文件提取max-fetch-size1Spring中文文档

适配器将远程目录和文件名分别放在 和 标头中。 从版本 5.0 开始,标头提供其他远程文件信息(默认情况下以 JSON 表示)。 如果将属性设置为 to ,则标头包含一个对象。 可以使用该方法访问底层 Apache Net 库提供的对象。 使用 XML 配置时,该属性不可用,但可以通过将 注入到其中一个配置类中来设置它。 另请参阅远程文件信息FileHeaders.REMOTE_DIRECTORYFileHeaders.REMOTE_FILEFileHeaders.REMOTE_FILE_INFOfileInfoJsonFtpStreamingMessageSourcefalseFtpFileInfoFTPFileFtpFileInfo.getFileInfo()fileInfoJsonFtpStreamingMessageSourceSpring中文文档

从版本 5.1 开始,其通用类型为 。 以前,它是. 这是因为排序现在在处理的早期执行,然后再筛选和应用。comparatorFTPFileAbstractFileInfo<FTPFile>maxFetchSpring中文文档

从 5.0 版开始,默认情况下,适配器会根据 in-memory 来防止远程文件的重复。 默认情况下,此筛选器也与文件名模式(或正则表达式)一起应用。 如果需要允许重复项,可以使用 . 任何其他用例都可以由 (或 ) 处理。 Java 配置(在本文档后面)展示了一种在处理后删除远程文件以避免重复的技术。FtpStreamingMessageSourceFtpPersistentAcceptOnceFileListFilterSimpleMetadataStoreAcceptAllFileListFilterCompositeFileListFilterChainFileListFilter

使用 Java 配置进行配置

以下 Spring Boot 应用程序显示了如何使用 Java 配置配置入站适配器的示例:Spring中文文档

@SpringBootApplication
public class FtpJavaApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder(FtpJavaApplication.class)
            .web(false)
            .run(args);
    }

    @Bean
    @InboundChannelAdapter(channel = "stream")
    public MessageSource<InputStream> ftpMessageSource() {
        FtpStreamingMessageSource messageSource = new FtpStreamingMessageSource(template());
        messageSource.setRemoteDirectory("ftpSource/");
        messageSource.setFilter(new AcceptAllFileListFilter<>());
        messageSource.setMaxFetchSize(1);
        return messageSource;
    }

    @Bean
    @Transformer(inputChannel = "stream", outputChannel = "data")
    public org.springframework.integration.transformer.Transformer transformer() {
        return new StreamTransformer("UTF-8");
    }

    @Bean
    public FtpRemoteFileTemplate template() {
        return new FtpRemoteFileTemplate(ftpSessionFactory());
    }

    @ServiceActivator(inputChannel = "data", adviceChain = "after")
    @Bean
    public MessageHandler handle() {
        return System.out::println;
    }

    @Bean
    public ExpressionEvaluatingRequestHandlerAdvice after() {
        ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
        advice.setOnSuccessExpression(
                "@template.remove(headers['file_remoteDirectory'] + headers['file_remoteFile'])");
        advice.setPropagateEvaluationFailures(true);
        return advice;
    }

}

请注意,在此示例中,转换器下游的消息处理程序具有一个在处理后删除远程文件的处理程序。adviceSpring中文文档