我有怪异的工作行为,不明白为什么会这样。我有以下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在作业中有什么目的?
请帮助理解这一点,谢谢
使用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来实现这个,或者有更好的方法来实现这个。