当前位置: 首页 > 知识库问答 >
问题:

Spring批处理提交间隔不工作和奇怪的作业行为

龚俭
2023-03-14

我有怪异的工作行为,不明白为什么会这样。我有以下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>

因此,我有一个step:throttle-limit=5和commit-interval=“100”,我假设writer将接收100个项目的块来编写,所有块都将被逐个处理。

但我有以下流程

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

另一个奇怪的事情是,如果我从tasklet配置中删除了task-executor,那么作业的行为就会像预期的那样。来到writer的文件块是4个,如果条目数量很大,而且我没有并发的writer调用,则是100个。

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

请帮助理解这一点,谢谢

共有1个答案

莫泓
2023-03-14

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

 类似资料:
  • 我正面临着Spring批处理的问题。我们在作业中使用了一个任务执行器(simpleAsyncTaskExecutor),它处理两个并行步骤的流程。 谢谢你。 下面是我的工作的配置(不包括我们的自定义编写器):

  • 我有一个非常简单的spring批处理,它从一个表中更新了一百万条记录。因为它非常简单,所以我尝试只实现一个更新表的Tasklet。 但我想用10个记录的步骤来promise。是可以在tasklet中实现这一点,还是我必须将itemReader/ItemWriter与块一起使用? 提前谢谢。

  • 此场景的解决方案-提交间隔为10,跳过限制为10,总输入记录为20,前9个记录有效,其余无效。 当已读取9条记录时,第10条无效。块大小是10,跳过限制是10,那么Spring批处理会在输出文件中写入那9条记录吗?如果不是,则继续读取剩余的记录,当读取第20条记录时,错误记录的计数为11,定义的跳过限制为10。因此该过程将立即停止。首先读取的有效记录的命运如何。 前9条记录是否写入输出文件。 请让

  • 1)读取器读取的任何记录都应通过处理器的处理传递给写入器 2)我的阅读器通过SQL查询读取记录,所以如果阅读器读取了100条记录,那么所有记录都应该一次传递给writer 3)如果读取1000条记录,则应同时通过所有1000条记录 4)所以从本质上说,提交间隔在这里是动态的,而不是固定的。 5)我们有什么办法可以做到这一点吗? 编辑: 现在我们想要的是动态提交间隔。读者正在阅读的任何内容,都将立即

  • 如何使用Java配置实现这一点?

  • 我有以下工作要处理在一定的时间间隔或特别的基础上。 作业中的步骤如下: 我也想要用户界面,在那里我可以触发一个特别的基础上的工作,而且我应该能够提供参数从用户界面。 我想用Spring batch来完成这个任务,但它更多的是用于读->处理->写之类的工作。这里,在第一步中,我正在生成由第二步读取的数据。我不确定我是否还可以使用Spring batch来实现这个,或者有更好的方法来实现这个。