Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring集成聚合器生成重复消息_Java_Spring_Spring Integration_Aggregator - Fatal编程技术网

Java Spring集成聚合器生成重复消息

Java Spring集成聚合器生成重复消息,java,spring,spring-integration,aggregator,Java,Spring,Spring Integration,Aggregator,我有一个项目,其spring集成流程定义如下: @Bean 公共集成流验证集成流(ValidationService ValidationService,ReleaseStrategy bundleReleaseStrategy){ 返回IntegrationFlows.from(ftpinintegrationflowConfiguration.BANK\u FTP\u通道) .split() .enrichHeaders(headerEnricherSpec->{ HeaderRicherS

我有一个项目,其spring集成流程定义如下:

@Bean
公共集成流验证集成流(ValidationService ValidationService,ReleaseStrategy bundleReleaseStrategy){
返回IntegrationFlows.from(ftpinintegrationflowConfiguration.BANK\u FTP\u通道)
.split()
.enrichHeaders(headerEnricherSpec->{
HeaderRicherSpec.headerFunction(目的地\频道\标题,消息->
validationService.validate((字符串)message.getPayload())?
BANK_FTP_有效通道:BANK_FTP_坏通道);
} )
.聚合(aggregatorSpec->aggregatorSpec
.correlationStrategy(message->message.getHeaders().get(DESTINATION\u CHANNEL\u HEADER))
.发布策略(捆绑策略)
.expireGroupsUponCompletion(真)
.groupTimeout(1000)
.sendPartialResultOnExpiry(真))
.路由(新的HeaderValueRouter(目的地\通道\头))
.get();
}
这样做的目的是验证每条消息并分配适当的目的地报头,然后将结果分组聚合,并将其发送到路由器以分派到正确的通道

我有一个检查流的服务,当它启动时,它会记录将要发送的消息的数量,在2个目标通道之后,我有2个句柄,告诉服务处理了一个X大小的包

下面是我得到的日志样本

2016-12-09 17:04:00.176 |[taskScheduler-2]| DEBUG | service.sync.impl.SynchronizationServiceInMemory | synchronization |启动correlationId[b5e69b73-aa99-4e9e-a7d2-59c015793a49]与值[7956]的同步
2016-12-09 17:04:01.397 |[taskScheduler-2]| DEBUG | service.sync.impl.SynchronizationServiceInMemory | Subtract和get |从correlationId[b5e69b73-aa99-4e9e-a7d2-59c015793a49]中减去[1000]。结果是[6956]
2016-12-09 17:04:01.752 |[taskScheduler-2]| DEBUG | service.sync.impl.SynchronizationServiceInMemory | Subtract和get |从correlationId[b5e69b73-aa99-4e9e-a7d2-59c015793a49]中减去[1000]。结果是[5956]
2016-12-09 17:04:02.114 |[taskScheduler-2]| DEBUG | service.sync.impl.SynchronizationServiceInMemory | Subtract和get |从correlationId[b5e69b73-aa99-4e9e-a7d2-59c015793a49]中减去[1000]。结果是[4956]
2016-12-09 17:04:02.410 |[taskScheduler-2]| DEBUG | service.sync.impl.SynchronizationServiceInMemory | Subtract和get |从correlationId[b5e69b73-aa99-4e9e-a7d2-59c015793a49]中减去[1000]。结果是[3956]
2016-12-09 17:04:02.681 |[taskScheduler-2]| DEBUG | service.sync.impl.SynchronizationServiceInMemory | Subtract和get |从correlationId[b5e69b73-aa99-4e9e-a7d2-59c015793a49]中减去[1000]。结果是[2956]
2016-12-09 17:04:02.991 |[taskScheduler-2]| DEBUG | service.sync.impl.SynchronizationServiceInMemory | Subtract和get |从correlationId[b5e69b73-aa99-4e9e-a7d2-59c015793a49]中减去[1000]。结果是[1956]
2016-12-09 17:04:03.344 |[taskScheduler-2]| DEBUG | service.sync.impl.SynchronizationServiceInMemory | Subtract和get |从correlationId[b5e69b73-aa99-4e9e-a7d2-59c015793a49]中减去[1000]。结果是[956]
2016-12-09 17:04:05.538 |[taskScheduler-5]| INFO | org.springframework.integration.aggregator.AbstractCorrelationMessageHandler | expireGroup |正在使用correlationKey[坏.通道]终止消息组
2016-12-09 17:04:05.538 |[taskScheduler-5]| DEBUG | service.sync.impl.SynchronizationServiceInMemory | Subtract和get |从correlationId[b5e69b73-aa99-4e9e-a7d2-59c015793a49]中减去[1]。结果是[955]
2016-12-09 17:04:05.590 |[taskScheduler-9]| DEBUG | service.sync.impl.SynchronizationServiceInMemory | Subtract和get |从correlationId[b5e69b73-aa99-4e9e-a7d2-59c015793a49]中减去[955]。结果是[0]
2016-12-09 17:04:06.635 |[taskScheduler-2]| WARN | service.sync.impl.SynchronizationServiceInMemory | subtractAndGet |[b5e69b73-aa99-4e9e-a7d2-59c015793a49]计数器找不到,忽略[955]的减法
正如您所看到的,在处理完所有消息后,我仍然会在ExpireGroup日志后记录一条警告,告诉我创建了另一个捆绑包

我尝试将日志放在聚合器之前,但没有出现重复的消息。有人可以帮助我配置聚合器以避免重复吗

ps:如果有什么帮助的话,下面是我如何实例化bundle发布策略的

new TimeoutCountSequenceSizeReleaseStrategy( 100, 1000L );

您应该解释为什么要通过该标题进行关联,而不是通过拆分后的默认标题correlationId进行关联。这也不清楚为什么您决定有一些重复我通过该头关联,因为在某些情况下我感觉默认的头没有传播,所以我想使用自定义头。我知道有一个副本,因为如果你看一下日志,所有的“包”由1000个元素组成,而最后2个元素是955,您可以看到该服务使用955调用了两次,在其他捆绑包中,该组也没有过期,因此在我看来,该重复是由该过期引起的,该过期是基于拆分器创建的相关密钥头的自定义日志,因此不能证明重复。我很高兴有一些测试用例可以从我这边播放。我一直在尝试用一个测试进行复制,但现在我只在整个应用程序运行时看到它,但我将尝试制作一个简单的应用程序来显示问题。我准备好后会更新这个问题