使用Spring Integration发送成功的FTP文件上载消息

时间:2017-01-03 21:52:45

标签: java spring spring-boot spring-integration

如何仅在成功进行FTP文件传输时触发要发送到JdbcOutboundGateway的邮件?

我有以下IntegrationFlow。它根据需要将文件上传到FTP服务器。但是,我需要向DB写入该文件已成功上载,或者如果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();
}

1 个答案:

答案 0 :(得分:1)

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

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

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

或者,将ExpressionEvaluatingMessageHandlerAdvice添加到ftp适配器,并在success频道上添加JDBC适配器流,并在failure频道上添加其他更新流。