创建sftp回复通道以回复错误或未成功发送的消息

时间:2016-09-14 09:51:03

标签: spring-integration spring-dsl spring-integration-sftp

我使用java dsl配置sfp出站流。

网关:

@MessagingGateway
 public interface SftpGateway {
 @Gateway(requestChannel = "sftp-channel")
 void sendFiles(List<Message> messages);
}

配置:

@Bean
public IntegrationFlow sftpFlow(DefaultSftpSessionFactory sftpSessionFactory) {
    return IntegrationFlows
            .from("sftp-channel")
            .split()
            .handle(Sftp.outboundAdapter(sftpSessionFactory, FileExistsMode.REPLACE)
            .useTemporaryFileName(false)
            .remoteDirectory(REMOTE_DIR_TO_CREATE).autoCreateDirectory(true)).get();
}

@Bean
public DefaultSftpSessionFactory sftpSessionFactory() {
...
}

如何配置流程以使我的网关回复失败的消息? 换句话说,我希望我的网关能够返回失败的消息列表,而不是无效。

我标记了网关      @MessagingGateway(errorChannel =“errorChannel”)

并写错误频道

@Bean
public IntegrationFlow errorFlow() {
    return IntegrationFlows.from("errorChannel").handle(new GenericHandler<MessagingException>() {

        public Message handle(MessagingException payload, Map headers) {
            System.out.println(payload.getFailedMessage().getHeaders());
            return payload.getFailedMessage();
        }
    })
            .get();
}

@Bean
public MessageChannel errorChannel() {
    return MessageChannels.direct().get();
}

如果出现一些错误(即没有连接到SFTP),我只得到一个错误(列表中第一条消息的有效负载)。 我应该把Advice放在哪里汇总所有消息?

1 个答案:

答案 0 :(得分:0)

这不是Spring Integration Java DSL的问题。

这主要是设计和架构任务。

目前您没有任何选择,因为您使用单向的Sftp.outboundAdapter(),因此没有任何回复。并且SftpGateway已准备好使用void返回类型的行为。

如果您有下游错误,您只能抛出它们或捕获并发送给某些error-channel

根据您的要求:

  

我希望我的网关能够返回失败的消息列表,而不是无效。

我说这取决于。实际上它只是从您的网关返回。因此,如果您将一个空列表返回到网关,这可能意味着没有错误。

由于Java不提供多重返回功能,因此除非在我们的流中执行构建该单个消息的内容,否则我们无法做出选择。我们决定了失败消息的列表。

由于您有.split(),因此您应该查看.aggregate()以构建一个回复。

聚合器与Splitter的关联非常简单,默认为applySequence = true

要发送给聚合器,我建议您查看ExpressionEvaluatingRequestHandlerAdvice端点上的Sftp.outboundAdapter().handle()的第二个参数)。有了这个,您应该将好消息和坏消息发送到同一个.aggregate()流。您可以迭代结果列表以从良好的结果中清除它。之后的结果可以使用SftpGateway标题发送到replyChannel

我知道这听起来有点复杂,但你想要的并不是开箱即用的。需要思考和发挥自己来弄清楚可以达到的目标。