Внедрить индикатор выполнения Spring Batch - получить общее количество строк при выполнении задания

1

У меня есть пакетное задание, которое считывается из базы данных с помощью 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>
  • 1
    Почему вы хотите сохранить общее количество в HibernateCursorItemReader? Общее количество строк - это просто информация, не связанная с вашим читателем и использующая слушатель (как вы это сделали) или дополнительный шаг перед 'first1', чтобы получить количество строк и сохранить его в jobExecutionContext. Вы также безопасны для перезапуска.
Теги:
spring
progress-bar
spring-batch
batch-processing

1 ответ

1
Лучший ответ

Перед тем, как Job Starts начнет обрабатывать тотальные элементы, т.е. строки

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню