Spring integration 创建sftp回复通道,以回复发送失败的错误或消息

Spring integration 创建sftp回复通道,以回复发送失败的错误或消息,spring-integration,spring-dsl,spring-integration-sftp,Spring Integration,Spring Dsl,Spring Integration Sftp,我正在使用JavaDSL来配置sfp出站流 网关: @MessagingGateway public interface SftpGateway { @Gateway(requestChannel = "sftp-channel") void sendFiles(List<Message> messages); } 如何配置流以使网关回复失败的消息? 换句话说,我希望我的网关能够返回失败的消息列表,而不是void 我在大门上打了个记号 @MessagingGateway(er

我正在使用JavaDSL来配置sfp出站流

网关:

@MessagingGateway
 public interface SftpGateway {
 @Gateway(requestChannel = "sftp-channel")
 void sendFiles(List<Message> messages);
}
如何配置流以使网关回复失败的消息? 换句话说,我希望我的网关能够返回失败的消息列表,而不是void

我在大门上打了个记号 @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();
}
@Bean
公共集成流errorFlow(){
返回IntegrationFlows.from(“errorChannel”).handle(新的GenericHandler(){
公共消息句柄(MessaginException有效负载、映射头){
System.out.println(payload.getFailedMessage().getHeaders());
返回有效负载。getFailedMessage();
}
})
.get();
}
@豆子
public MessageChannel errorChannel(){
返回MessageChannels.direct().get();
}
如果出现一些错误(即没有连接到SFTP),我只会得到一个错误(列表中第一条消息的有效负载)。
我应该将建议放在哪里来聚合所有消息?

这不是Spring Integration Java DSL的问题

这主要是一项设计和架构任务

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

如果您有一个下游错误,您只能抛出它们或捕获并发送到某个
错误通道

根据您的以下要求:

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

我认为这要视情况而定。实际上,它只是从你的网关返回。所以,若您将一个空列表返回到网关,这可能意味着并没有错误

由于Java不提供多返回功能,我们没有选择,除非在我们的流中做一些事情来构建要返回的单个消息。当我们确定失败消息的列表时

既然您有
.split()
,那么您应该查看
.aggregate()
来构建单个回复

聚合器通过默认的
applySequence=true
与拆分器关联起来非常容易

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


我知道这听起来有点复杂,但你想要的东西不是现成的。需要自己思考和发挥,以找出可以达到的目标。

这不是Spring Integration Java DSL的问题

这主要是一项设计和架构任务

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

如果您有一个下游错误,您只能抛出它们或捕获并发送到某个
错误通道

根据您的以下要求:

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

我认为这要视情况而定。实际上,它只是从你的网关返回。所以,若您将一个空列表返回到网关,这可能意味着并没有错误

由于Java不提供多返回功能,我们没有选择,除非在我们的流中做一些事情来构建要返回的单个消息。当我们确定失败消息的列表时

既然您有
.split()
,那么您应该查看
.aggregate()
来构建单个回复

聚合器通过默认的
applySequence=true
与拆分器关联起来非常容易

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


我知道这听起来有点复杂,但你想要的东西不是现成的。需要自己思考和发挥,以找出可以达到的目标。

Artem,感谢您的回复!您能提供一些ExpressionEvaluationRequestHandlerAdvice的例子吗?对于这样的自定义逻辑,使用
errorChannel
总是不好的。这个是全局的,在许多其他异步组件中用作默认错误通道:对,您只能抛出一个异常,也只能返回一个回复。这里的工作原理与原始Java完全相同。别无选择。如果您希望收集所有拆分项目的错误,并且不影响其他项目,您应该研究聚合器解决方案。是的,看看
表达式evaluation requesthandleradvice
及其
trapException
选项:正如我所说的:您必须将其放入第二个
参数的
.advice()
。例如电子邮件发送案例:
e->e.id(“mailOut”).advice(afterMailAdvice())
Artem,谢谢您的回复!您能提供一些ExpressionEvaluationRequestHandlerAdvice的例子吗?对于这样的自定义逻辑,使用
errorChannel
总是不好的。这个是全局的,在许多其他异步组件中用作默认错误通道:对,您只能抛出一个异常,也只能返回一个re
@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();
}