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

时间:2016-07-29 06:44:53

标签: java spring spring-batch

我有奇怪的工作行为,无法理解为什么会这样。 我有以下弹簧批量配置:

<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 个答案:

答案 0 :(得分:1)

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