Как применить секционированный счетчик для 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

Другие вопросы по тегам