java - Spring Batch 提交间隔不起作用并且工作行为很奇怪

标签 java spring spring-batch

我的工作行为很奇怪,无法理解为什么会发生这种情况。 我有以下 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个项目的 block ,并且所有 block 都将被一一处理。

但我有以下流程:

如果作业流程中有 4 个项目,那么我会看到 writer 收到 1 个项目并调用 4 次,而不是单次调用 4 个项目。 除此之外,所有这 4 个调用都是并发执行的,即同时执行,这很奇怪。

另一个奇怪的事情是,如果我从 tasklet 配置中删除任务执行器,那么作业就会开始像预期的那样运行。如果项目数量很大并且我没有并发的写入器调用,则写入写入器的文件 block 为 4 个或 100 个。

有人可以解释为什么会发生这种情况吗? 为什么taskExecutor以这种奇怪的方式改变作业流程以及taskExecutor在作业中的目的是什么?

请帮助理解这一点,谢谢

最佳答案

使用任务执行器和 throttle 限制,您可以声明多线程步骤。所以你有 5 个并发读写的线程。如果不需要,请从步骤声明中删除任务执行器和限制限制。
另外,如果您使用多线程,您应该使用线程安全的 ItemReader 和 ItemWriter

关于java - Spring Batch 提交间隔不起作用并且工作行为很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38652160/

相关文章:

java - Android 真的需要多 Activity 吗?

spring - 注释数组作为注释的参数,在 Scala 中

java - Spring @async 注释可能无法触发的原因是什么?

db2 - 在 DB2 for iSeries 上使用触发器执行选择时出现 SQL0443 错误

java - Java函数参数总是按值传递吗?

java - 如果我们从 java 中删除已检查的异常会发生什么?

java - 当我在springboot API上使用@OneToMany和@ManyToOne时出现错误消息

java - 如何将 spring batch jar 转换为 tomcat 上的可部署 war

java - 尝试仅获取值的子集时,FixedLength 会出现问题

java - 将多个正则表达式组合成一个自动机