我有一个使用HibernateCursorItemReader
从数据库读取的批处理作业,使用自定义处理器处理结果,然后提交到另一个数据库。
我想要展示的是针对要处理的总项目处理了多少项目。
我尝试使用JobExecutionListener
实现自定义@beforeJob
以获取第一个表中的行数,然后可以对其进行比较
反对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>
答案 0 :(得分:2)
在作业开始之前获得要处理的总项目,即行
<强> BatchJobExecutionListener.class 强>
public void beforeJob(JobExecution jobExecution) {
int total = dao.getTotalRows();
jobExecution.getExecutionContext().put("JobComplete", total);
}
在作业执行期间检索总项目并与读取计数进行比较
<强> JobWrapper.class 强>
...
private JobExecution jobE;
...
public Long getProgress() {
double jobComplete = (Double) jobE.
getExecutionContext().
get("jobComplete");
double reads = 0;
for (StepExecution step : jobE.getStepExecutions()) {
reads = reads + step.getReadCount();
}
return Math.round(reads / jobComplete * 100);
}