spring-integration - 任何/所有服务激活器完成后的输出和错误通道
问题描述
我想在服务任何/所有服务激活器完成执行后执行一些操作。流程定义如下:
@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) 服务激活器执行不成功时执行一些代码。
如果服务执行器是已知的/定义了流,这可以通过定义另一个流并添加输出通道和错误来实现。不确定,在我的情况下如何实现相同的目标。
解决方案
首先,您需要了解mySourceChannel
,当第一条消息发送到第一个服务激活器而下一条消息发送到第二个服务激活器时,您将最终获得它们之间的循环平衡。等等奇偶方式。因此,您应该确保这正是您所需要的,除了这样的配置。
要对服务激活器的执行结果进行一些分析,您需要使用ExpressionEvaluatingRequestHandlerAdvice
. 如果需要,它具有successChannel
和failureChannel
选项以及适当的表达式。
您可以将对其 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;
}
推荐阅读
- android - 为Android构建时FeathersJS登录错误
- ruby-on-rails - 为什么我不能在 dockerfile 中加载环境变量?
- git - 操作在 300000 毫秒后超时,在“git clone”上收到 0 个字节中的 0 个字节
- python - ValueError:检查输入时出错:预期 conv2d_1_input 的形状为 (128, 75, 1) 但得到的数组的形状为 (1, 128, 1)
- excel - 用户表单的复杂变量名称
- python - Python3 argparse:当将字符串作为 arg 传递时运行 funcA,如果虚线 arg 运行另一个 func
- python - 为什么 python subprocess 命令在通过 API 调用执行时得到 [Errno 2] No such file or directory: 'ls': 'ls'
- twilio - 将 Twilio 语音 Autobot 转移到电话号码
- powerbi - 查找购买特定产品的每个 customerID 的最早日期行并在新列中返回日期
- database - 如何从谷歌云数据存储中插入/获取实体(python)