【问题标题】:Output and Error Channel after any/all service activator is done任何/所有服务激活器完成后的输出和错误通道
【发布时间】:2018-12-20 16:17:36
【问题描述】:

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

@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-integration spring-integration-dsl


    【解决方案1】:

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

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

    您可以将对其 bean 的引用注入到 @ServiceActivatoradviceChain 属性中。像这样的:

        @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

    【讨论】:

    • 感谢 Artem 的所有帮助 :)
    • 我想将 myHandlerChannel 初始化为执行器通道,以便在单独的线程中执行。另外,我想将消息传递给所有订阅者,而不是循环传递。在这种情况下我应该使用什么样的渠道。
    • PublishSubscribeChannel 随时为您服务。仅阅读参考手册有什么问题:docs.spring.io/spring-integration/reference/html/…
    猜你喜欢
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    相关资源
    最近更新 更多