我正在使用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和相关逻辑),并使其可插入,因为我的不同微服务具有不同的定制聚合逻辑。
我非常想知道第四季度的答案,感谢您的投入,谢谢。
答案 0 :(得分:0)
MessageGroupStoreReaper
而不是使用组超时来解决它。