gpt4 book ai didi

java - 实现 Spring Batch 进度条 - 获取作业执行的总行数

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:22:33 27 4
gpt4 key购买 nike

我有一个批处理作业,它使用 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>

最佳答案

在作业开始之前获取要处理的总项目数,即行数

BatchJobExecutionListener.class

public void beforeJob(JobExecution jobExecution) {      

int total = yourDao.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);
}

关于java - 实现 Spring Batch 进度条 - 获取作业执行的总行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27153162/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com