【发布时间】:2014-11-26 15:38:38
【问题描述】:
我有一个批处理作业,它使用 HibernateCursorItemReader 从数据库读取数据,使用自定义处理器处理结果,然后提交到另一个数据库。
我想显示的是已处理的项目数相对于要处理的总项目数。
我尝试使用@beforeJob 实现自定义JobExecutionListener 以从第一个表中获取行数,然后可以进行比较
针对Job Execution 定期提交。
有没有比使用Job Execution 监听器更好的方法。是否可以在第一次读取时获取表的总行数,在初始化期间在 HibernateCursorItemReader 上设置一个值或类似的东西?
工作
<batch:job id="SomeLongJob" job-repository="jobRepository" restartable="true">
<batch:listeners>
<batch:listener ref="batchJobExecutionListener" />
</batch:listeners>
<batch:step id="first1">
<tasklet transaction-manager="hibernateTransactionManager">
<chunk reader="hibernateItemReader"
processor="batchCustomProcessor"
writer="hibernateItemWriter"
skip-limit="0"
commit-interval="10">
</chunk>
</tasklet>
</batch:step>
</batch:job>
阅读器
<bean id="hibernateItemReader"
class="org.springframework.batch.item.database.HibernateCursorItemReader">
<property name="queryString" value="from MyTable" />
<property name="sessionFactory" ref="sessionFactory" />
</bean>
【问题讨论】:
-
为什么要将总数存储到 HibernateCursorItemReader 中?总行数只是与您的阅读器无关的信息,并且使用侦听器(如您所做的那样)或在“first1”之前的额外步骤来获取行数并将其存储到jobExecutionContext中。您也可以安全地重新启动。
标签: java spring progress-bar batch-processing spring-batch