Spring Batch commit-interval不起作用和奇怪的工作行为

我有奇怪的工作行为,无法理解为什么会这样 . 我有以下 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”,我假设编写器将接收100个要写入的块,并且将逐个处理所有块 .

但我有以下流程:

如果作业有4个项目在流程中,那么我看到作者收到1个项目并且调用4次,而不是单个时间有4个项目 . 除此之外,所有这4个调用同时执行,意思是同时执行,这非常奇怪 .

另一个奇怪的事情是,如果我从tasklet配置中删除任务执行程序,那么作业开始表现得像预期的那样 . 进入编写器的文件块是4,如果项目数量很大,则为100,并且我没有并发编写器调用 .

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

请帮助理解这一点,谢谢

回答(1)

2 years ago

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