Spring batch 决定Spring批处理步骤、Tasklet还是块
我有一个直截了当的要求,我需要阅读一个项目列表(来自数据库),需要处理这些项目,一旦处理完毕,就必须将其更新到数据库中 我正在考虑将Spring批处理块与reader、processor和writer一起使用。我的阅读器将从列表中一次返回一个项目,并将其发送到处理器,一旦处理结束,它将返回到Writer,在那里更新数据库 我以后可能会用这些方法中的一些同步成本来多线程处理它 在这里,我预见到一些担忧Spring batch 决定Spring批处理步骤、Tasklet还是块,spring-batch,Spring Batch,我有一个直截了当的要求,我需要阅读一个项目列表(来自数据库),需要处理这些项目,一旦处理完毕,就必须将其更新到数据库中 我正在考虑将Spring批处理块与reader、processor和writer一起使用。我的阅读器将从列表中一次返回一个项目,并将其发送到处理器,一旦处理结束,它将返回到Writer,在那里更新数据库 我以后可能会用这些方法中的一些同步成本来多线程处理它 在这里,我预见到一些担忧 要处理的项目数可能会更多。可能在10万甚至更多 处理器中需要一些逻辑计算。因此,一次处理1个项目
谢谢,Spring Batch是满足您需求的完美工具 面向区块的步骤允许您使用提交间隔属性配置要读取/处理/写入的项目数
<batch:step id="step1" next="step2">
<batch:tasklet transaction-manager="transactionManager" start-limit="100">
<batch:chunk reader="myReader" processor="myProcessor" writer="MyWriter" commit-interval="800" />
<batch:listeners>
<batch:listener ref="myListener" />
</batch:listeners>
</batch:tasklet>
</batch:step>
假设读者将调用返回10000条记录的SELECT语句。您将提交间隔设置为500
MyReader将调用read()方法500次。假设在现实中,阅读器实现实际上可能会从结果集中删除项。对于每个read()调用,它还将调用MyProcessor的process()方法
但在达到提交间隔之前,它不会调用MyWriter的write()方法
如果查看接口ItemWriter的定义:
public interface ItemWriter<T> {
/**
* Process the supplied data element. Will not be called with any null items
* in normal operation.
*
* @throws Exception if there are errors. The framework will catch the
* exception and convert or rethrow it as appropriate.
*/
void write(List<? extends T> items) throws Exception;
}
公共接口ItemWriter{
/**
*处理提供的数据元素。将不会使用任何空项调用
*在正常运行中。
*
*@在出现错误时引发异常。框架将捕获
*异常,并根据需要对其进行转换或重新排序。
*/
非常感谢你的建议。真的很有帮助。请你指导一下好吗?