如何继续在具有轮询的单个线程上执行聚合?

时间:2019-04-24 12:08:21

标签: spring-integration spring-integration-dsl

我创建了一个流程,该流程按状态轮询数据库中的行,对其进行验证,然后将其汇总到集合中。处理完整个流程后,每行都将设置为适当的状态。但是,当我将聚合器与发布策略TimeoutCountSequenceSizeReleaseStrategy一起使用时,经过的时间非常短,则不会发生发布组。之后,下面的轮询将在另一个线程中进行,但是直到消息数量不会达到策略中的目标(阈值)时,之前的消息组才被处理。

我的流程代码:

@Bean
public IntegrationFlow testFlow(EntityService entityService,
                                EntityValidator entityValidator,
                                EntityFlowProperties properties,                                       
                                EntityChecker checker) {
    return IntegrationFlows
            .from(getMessageSource(entityService::getByStatus, properties.getMaxRowsPerPoll()),
                    e -> e.poller(getPollerSpec(properties)))
            .split()
            .transform(entityValidator::validate)
            .filter(ValidationStatus<Entity>::isValid, filter ->
                    filter.discardFlow(flow -> flow.handle(entityService::handleValidationErrors)))
            .transform(ValidationStatus<Entity>::getEntity)
            .aggregate(aggregatorSpec -> aggregatorSpec.releaseStrategy(new TimeoutCountSequenceSizeReleaseStrategy(5, 10000)))
            .transform(checker::checkOnSomething)
            .split()
            .transform(CheckResultAware<Entity>::getEntity)
            .handle(entityService::saveAndChangeStatus)
            .get();

我希望在与轮询相同的线程上执行聚合,并且在当前流程结束之前不要进行新的轮询。

在轮询和聚合之间更改状态的方法不合适。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

您为什么需要TimeoutCountSequenceSizeReleaseStrategy;您的序列是有限的;只需使用默认的SimpleSequenceSizeReleaseStrategy

无论如何,TimeoutCountSequenceSizeReleaseStrategy应该根据序列大小释放。

但是,它实际上并不适合您的用例,因为您可以在商店中留出部分分组。