Spring集成Scatter-Gather模式与JMS传输

时间:2017-08-11 13:59:40

标签: spring jms spring-integration enterprise-integration

我需要实现以下架构:

  1. 我必须使用JMS将数据发送到系统(某些外部应用程序)。

  2. 根据您只需要发送到必要系统的数据(例如,如果系统数量为4,那么您可以从1发送到4)

  3. 有必要等待来自发送消息的系统的响应,在收到所有答案后,需要处理接收到的数据(或处理至少一次超时)

  4. 相关ID包含在传出和传入JMS消息的标头中

  5. 每个新的此类流程都可以异步并行启动

  6. 现在我只在Spring JMS的帮助下实现了它。我手动同步线程,也手动管理线程池。

    关于发送消息的系统的相关ID和信息存储为状态,并在收到新消息后更新它等。

    但我想简化逻辑并使用Spring-integration Java DSL,Scatter聚集模式(这只是我的案例)和其他有用的Spring功能。

    您能否帮我展示一下如何在Spring-integration / IntregrationFlow的帮助下实现这样的架构?

1 个答案:

答案 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和公共端点选项的直接属性。