我有奇怪的工作行为,无法理解为什么会这样。 我有以下弹簧批量配置:
<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在工作中的目的是什么?
请帮助理解这一点,谢谢
答案 0 :(得分:1)
使用task-executor和throttle-limit,您可以声明多线程步骤。所以你有5个并发读写的线程。如果您不需要,请从步骤声明中删除task-executor和throttle-limit 此外,如果您使用多线程,则应使用线程安全的ItemReader和ItemWriter