Я реализую пакетное приложение Spring, которое выполняет некоторые обновления базы данных. Здесь нет входных / выходных файлов, только прямые обновления базы данных.
Программа выложена так:
- Подготовительный тасклет вызывает процедуру DB для получения всех параметров задания и работы, которую необходимо выполнить
- работа отправляется партнеру, где работа разбивается на потоки
- Запускается тасклет вызова и вызывается в каждом потоке для вызова другой процедуры, которая выполняет фактические обновления в базе данных
- После того, как все потоки выполнены, вызывается процедура "end", чтобы закрыть все журналы БД
Моя проблема находится между шагами 3 и 4. После того, как каждый поток завершен, он собирает выходные параметры процедуры, одним из которых является объем работы, который он фактически обновил. Я хочу быть в состоянии сохранить промежуточный итог всех потоков и сколько работы было сделано всеми. Затем эта информация будет передана на шаг 4, который будет включать эти итоги в таблицы журналов БД.
В настоящее время я добавляю любой вывод из процедуры на шаге 3 в Map<String, String> resultMap
и вижу общее количество каждого потока. Моя проблема заключается в том, как сохранить все ВСЕ потоки для передачи на шаг 4.
Я попытался объявить пару переменных в верхней части Tasklet Invocation, которые будут использоваться для поддержания промежуточного итога. Проблема в том, что их значения сбрасываются после каждого потока, хотя я использую +=
при назначении значений из карты
public class SpringBatchInvocationTasklet implements Tasklet, StepExecutionListener {
int totalWork = 0;
int totalWorkProcessed = 0;
@Override
public RepeatStatus execute(StepContribution arg0, ChunkContext chunkContext) throws Exception {
Map<String, String> resultMap = SpringBatchDAO.process(workList, dbLogId, commitVal, userName, threadNo);
totalWork += Integer.parseInt(resultMap.get(SpringBatchConstants.TOTAL_WORK));
totalWorkProcessed += Integer.parseInt(resultMap.get(SpringBatchConstants.TOTAL_WORK_PROCESSED));
}
}
Подводя итог, я должен иметь возможность получить промежуточную сумму всех потоков за выполненную ими работу и передать ее в конечный процесс.
Спасибо за любую помощь в этом!