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