【问题标题】:Implement A Spring Batch Progress Bar - Get total row count on Job Execution实施 Spring Batch 进度条 - 获取作业执行的总行数
【发布时间】: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


【解决方案1】:

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

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);
}

【讨论】:

    猜你喜欢
    • 2014-12-10
    • 2012-06-12
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2019-10-24
    • 2015-11-25
    相关资源
    最近更新 更多