Как применить секционированный счетчик для MultiResourceItemReader?
У меня есть файл из 50К записей. Это займет около 40 минут, чтобы вставить его в БД. Поэтому я подумал о том, чтобы применить к шагу раздел таким образом, чтобы записи по 50 тыс. Были разделены между 10 потоками (через gridSize
) с каждым потоком, обрабатывающим 1000 записей параллельно.
Все форумы показывают примеры использования JDBCPagingItemReader
и секционированное количество, установленное через контекст выполнения. Так как я использую MultiResourceItemReader
как установить счетчик разделов (startingIndex
а также endingIndex
- см. фрагмент кода ниже) для MultiResourceItemReader
?
Пожалуйста, порекомендуйте.
Фрагмент кода разделителя ниже:
public Map partition(int gridSize) {
LOGGER.debug("START: Partition");
Map partitionMap = new HashMap();
int startingIndex = 0;
int endingIndex = 1000;
for(int i=0; i< gridSize; i++){
ExecutionContext ctxMap = new ExecutionContext();
ctxMap.putInt("startingIndex",startingIndex);
ctxMap.putInt("endingIndex", endingIndex);
startingIndex = endingIndex+1;
endingIndex += 1000;
partitionMap.put("Thread:-"+i, ctxMap);
}
LOGGER.debug("END: Created Partitions of size: "+ partitionMap.size());
return partitionMap;
}
1 ответ
Вы не устанавливаете количество разделов на MultiResourceItemReader
, Вы используете MultiResourcePartitioner
создать раздел для каждого ресурса (файла), а затем заставить читателя подобрать каждый файл отдельно как отдельный раздел. С такой конфигурацией вам не нужно MultiResourceItemReader
больше (вы можете пойти прямо к делегату).
В примерах Spring Batch приведен пример этого варианта использования, который можно найти здесь: https://github.com/spring-projects/spring-batch/blob/master/spring-batch-samples/src/main/resources/jobs/partitionFileJob.xml