Spring 批处理提交间隔不起作用且工作行为怪异

Spring Batch commit-interval doesn't work and weird job behaviour

我的工作行为很奇怪,不明白为什么会这样。 我有以下 spring 批处理配置:

<beans:bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <beans:property name="corePoolSize" value="50"/>
    <beans:property name="maxPoolSize" value="100"/>
    <beans:property name="queueCapacity" value="100"/>
</beans:bean>



<job id="creationFlowSaveJob">
    <step id="creationFlowCampaignSaveStep">
        <tasklet task-executor="taskExecutor"
                 throttle-limit="5">
            <chunk
                    reader="creationFlowCampaignSaveReader"
                    processor="creationFlowCampaignSaveProcessor"
                    writer="creationFlowCampaignSaveWriter"
                    commit-interval="100"
                    >
            </chunk>
        </tasklet>
        <listeners>
            <listener ref="generalStepLogger"/>
        </listeners>
    </step>
</job>

所以我有 throttle-limit = 5 和 commit-interval="100" 的步骤,我假设 writer 将收到 100 个要写入的项目块,并且所有块将被一个接一个地处理。

但我有以下流程:

如果作业中有 4 个项目,那么我看到作者收到 1 个项目并调用 4 次,而不是单次调用 4 个项目。 另外这4个调用都是并发执行的,意思是同时执行,这很奇怪。

另一个奇怪的事情是,如果我从 tasklet 配置中删除 task-executor,那么作业开始表现得像预期的那样。提交给编写器的文件块是 4 个,如果项目数量很大并且我没有并发编写器调用,则为 100 个。

有人可以解释为什么会这样吗? 为什么 taskExecutor 以这种奇怪的方式改变作业流程,如果 taskExecutor 在作业中的目的是什么?

请帮助理解这一点,谢谢

使用 task-executor 和 throttle-limit 声明多线程步骤。所以你有 5 个线程并发读写。如果不需要,请从步骤声明中删除 task-executor 和 throttle-limit。
另外,如果你使用多线程,你应该使用线程安全的 ItemReader 和 ItemWriter