У меня есть пакетное задание, которое считывается из базы данных с помощью 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>
Перед тем, как 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);
}