Spring集成-与JDBCChannelMessageStore的聚合

时间:2020-07-06 03:29:58

标签: spring-integration aggregation spring-integration-dsl

我正在使用Spring Boot 2.0.x和Spring Integration5.0.x。我可以使用correlationStrategy和releaseStrategy的自定义逻辑成功实现事件的聚合,而无需使用拆分器。

    
      @Bean
        public IntegrationFlow aggregateFlow() {
            return f -> f
                    .transform(transformUtils::toSvcInput)// this will transform the input event
                    .aggregate(agg -> agg.outputProcessor(group ->
                                    new ResultAggregator("TBD",group.getMessages()
                                            .stream()
                                            .map(message -> (RusultService) message.getPayload())
                                            .collect(Collectors.toList())))
                            .correlationStrategy(cs -> ((RusultService)cs.getPayload()).getEvent().getApplicationNumber())
                            .releaseStrategy(group -> (group.getMessages().stream()
                                    .allMatch(e -> ((RusultService)e.getPayload()).getEvent()
                                            .getProducts().get(0).getSubProductCode().equals("500")) && group.getMessages().size()==2) ||
                                    (group.getMessages().stream()
                                            .noneMatch(e -> ((RusultService)e.getPayload()).getEvent()
                                                    .getProducts().get(0).getSubProductCode().equals("500")) && group.getMessages().size()==1))
                            .messageStore(jdbcMessageGroupStore)
                            .sendPartialResultOnExpiry(false)                       
                            .expireGroupsUponCompletion(true)
                            .discardChannel("nullChannel")
                            .groupTimeout(600000L))
                    .channel("subsequentFlow.input");
        } 

messageStore是使用Oracle数据源配置的JdbcMessageStore。

Q1。上面的配置在集群环境中是否很好,是否需要部署此代码的多个实例,是否还需要配置其他参数?

第二季度。如果我更改relatedStrategy / release策略逻辑并重新部署应用程序,则消息存储中以前的消息会卡住,即使超时也不会释放(过期)。还有其他解决方法吗?

Q3。如果我使用相同的消息存储库创建另一个具有不同自定义逻辑的聚合器,会不会有问题?

Q4。如何使用JdbcChannelMessageStore实现相同的聚合(使用自定义的releaseStrategy和correlationStrategy)(这是正确的用例),您是否有示例项目?

我正在计划使用注释实现相同的聚合器bean(具有定制的releaseStrategy和相关逻辑),并使其可插入,因为我的不同微服务具有不同的定制聚合逻辑。

我非常想知道第四季度的答案,感谢您的投入,谢谢。

1 个答案:

答案 0 :(得分:0)

  1. 看起来正确。
  2. 那是一个错误;我打开了issue。 您可以使用MessageGroupStoreReaper而不是使用组超时来解决它。
  3. 否;只要它具有不同的相关算法(但请参阅问题中的我的注释)。
  4. 频道存储库不适合在此使用;这是对JDBC表支持的通道的优化。