我需要实现以下架构:
我必须使用JMS将数据发送到系统(某些外部应用程序)。
根据您只需要发送到必要系统的数据(例如,如果系统数量为4,那么您可以从1发送到4)
有必要等待来自发送消息的系统的响应,在收到所有答案后,需要处理接收到的数据(或处理至少一次超时)
相关ID包含在传出和传入JMS消息的标头中
每个新的此类流程都可以异步并行启动
现在我只在Spring JMS的帮助下实现了它。我手动同步线程,也手动管理线程池。
关于发送消息的系统的相关ID和信息存储为状态,并在收到新消息后更新它等。
但我想简化逻辑并使用Spring-integration Java DSL,Scatter聚集模式(这只是我的案例)和其他有用的Spring功能。
您能否帮我展示一下如何在Spring-integration / IntregrationFlow的帮助下实现这样的架构?
答案 0 :(得分:1)
以下是我们的测试用例中的一些示例:
@Bean
public IntegrationFlow scatterGatherFlow() {
return f -> f
.scatterGather(scatterer -> scatterer
.applySequence(true)
.recipientFlow(m -> true, sf -> sf.handle((p, h) -> Math.random() * 10))
.recipientFlow(m -> true, sf -> sf.handle((p, h) -> Math.random() * 10))
.recipientFlow(m -> true, sf -> sf.handle((p, h) -> Math.random() * 10)),
gatherer -> gatherer
.releaseStrategy(group ->
group.size() == 3 ||
group.getMessages()
.stream()
.anyMatch(m -> (Double) m.getPayload() > 5)),
scatterGather -> scatterGather
.gatherTimeout(10_000));
}
所以,有部分:
scatterer
- 向收件人发送邮件。在您的情况下所有这些JMS服务。那可能是scatterChannel
。通常为PublishSubscribeChannel
,因此Scatter-Gather
可能不知道副词中的子标记。
gatherer
- 好吧,它只是一个aggregator
,包含所有可能的选项。
scatterGather
- 只是为了方便ScatterGatherHandler
和公共端点选项的直接属性。