首页 > 解决方案 > 任何/所有服务激活器完成后的输出和错误通道

问题描述

我想在服务任何/所有服务激活器完成执行后执行一些操作。流程定义如下:

@Bean
public IntegrationFlow myFlow(MessageSource<Object> someMessageSource) {
    return IntegrationFlows.from(someMessageSource,
            c -> c.poller(Pollers.fixedRate(1, SECONDS)
                    .maxMessagesPerPoll(10)))
            .channel(mySourceChannel())
            .get();
}

@Bean
public MessageChannel mySourceChannel() {
    return new ExecutorChannel(executor());
}

两个服务激活器定义为

public static class MyFooActivator {  
    @ServiceActivator(inputChannel = "mySourceChannel")
    public void doSomething(FooTask event) {
      //handle foo task
    }
}

public static class MyBarActivator { 
    @ServiceActivator(inputChannel = "mySourceChannel")
    public void doSomething(BarTask event) {
        // handle bar task
    }
}

如您所见,服务激活器没有定义为集成流的一部分,而是通过注释定义的。目标是在 1) 服务激活器执行成功 2) 服务激活器执行不成功时执行一些代码。

如果服务执行器是已知的/定义了流,这可以通过定义另一个流并添加输出通道和错误来实现。不确定,在我的情况下如何实现相同的目标。

标签: spring-integrationspring-integration-dsl

解决方案


首先,您需要了解mySourceChannel,当第一条消息发送到第一个服务激活器而下一条消息发送到第二个服务激活器时,您将最终获得它们之间的循环平衡。等等奇偶方式。因此,您应该确保这正是您所需要的,除了这样的配置。

要对服务激活器的执行结果进行一些分析,您需要使用ExpressionEvaluatingRequestHandlerAdvice. 如果需要,它具有successChannelfailureChannel选项以及适当的表达式。

您可以将对其 bean 的引用注入adviceChain@ServiceActivator. 像这样的东西:

    @Bean
    @ServiceActivator(inputChannel = "myHandlerChannel", adviceChain = "myHandlerAdvice")
    public MessageHandler myHandler() {
        return message -> { };
    }

    @Bean
    public Advice myHandlerAdvice() {
        ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
        advice.setOnSuccessExpressionString("payload");
        advice.setSuccessChannel(myHandlerSuccessChannel());
        return advice;
    }

更多信息在参考手册中:https ://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#expression-advice


推荐阅读