【问题标题】:Sending Successful FTP File Upload Message with Spring Integration使用 Spring 集成发送成功的 FTP 文件上传消息
【发布时间】:2017-01-03 21:52:44
【问题描述】:

如何仅在成功的 FTP 文件传输时触发消息发送到 JdbcOutboundGateway?

我有以下集成流。它可以根据需要将文件上传到 FTP 服务器。但是,然后我需要写入文件已成功上传的数据库,或者如果 FTP 上传失败,则更新记录。我无法弄清楚如何在文件传输成功时启动数据库更新。在我尝试继续流程的任何地方,它都会抛出一个异常,说明它是“单向”的。

  • ftpProps 包含各种 FTP 设置的所有配置值
  • outboundMessages 是放置需要通过 FTP 发送的消息的通道
  • ftpSessionFactoryFactory 从配置文件中的值构建所有各种 FtpSessionFactory 对象,然后路由器将通过检查标头值来确定将消息发送到哪个对象

流程:

@Bean
public IntegrationFlow fromOutboundChannelToFtp(OutboundConfigurationProperties ftpProps,
                                                @Qualifier(OUTBOUND_CHANNEL) MessageChannel outboundMessages,
                                                @Qualifier(FTP_SESSION_FACTORY_FACTORY) FtpSessionFactoryFactory ftpSessionFactoryFactory) {
    return IntegrationFlows.from(outboundMessages)
            .route(RECEIVER_HEADER_SPEL, mapping -> {
                for (String receiverId : ftpProps.getFtp().keySet()) {
                    mapping.subFlowMapping(receiverId, sf -> {
                        sf.handleWithAdapter(adapter ->
                            adapter.ftp(ftpSessionFactoryFactory.getFactory(receiverId))
                            .fileNameExpression(FILENAME_HEADER_SPEL)
                            .autoCreateDirectory(true)
                            .remoteDirectory(ftpProps.getValue(receiverId, FtpProp.DIRECTORY))
                        );
                    });
                }
            })
            .get();
}

【问题讨论】:

    标签: java spring spring-boot spring-integration


    【解决方案1】:

    outboundMessages 设为发布/订阅通道,并使用 JDBC 适配器为其订阅第二个流。在路由器和 jdbc 适配器使用者上设置 order 属性,以确保以正确的顺序调用它们。

    默认情况下,如果第一个消费者失败,则不会调用第二个消费者。

    在流入口点(通道上游)使用错误通道来处理故障。

    或者,将ExpressionEvaluatingMessageHandlerAdvice 添加到 ftp 适配器并在 success 通道上添加 JDBC 适配器流,在 failure 通道上添加不同的更新流。

    【讨论】:

    • 是否有任何非 xml 示例可供参考?我无法找到如何使用 order 属性执行您建议的操作。与无法找到任何非 xml 示例来弄清楚如何实现它的表达式建议相同。
    • 我昨天发布了一个Pull Request 并进行了一些改进(以及使用 DSL 进行配置的文档)。在合并(并发布)之前,您必须使用不同的 channel() bean 而不是通道名称。命令继续消费者(如建议)。
    • 太好了,谢谢!通过查看lines 408 - 430 并传入通道(而不是新添加的名称方法),我能够弄清楚如何配置它。
    猜你喜欢
    • 2016-02-23
    • 1970-01-01
    • 2015-05-31
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多