Весенняя пакетная многопоточность с использованием секционирования - PullRequest
1 голос
/ 30 января 2020

Моя проблема заключается в том, что я должен передать несколько номеров файлов для чтения пружинных пакетов, а программа чтения запускается в parellel.Если мы используем grid-size = 100, тогда будет 100 потоков, что не логично. Как решить эту проблему, т. е. обрабатывать много файлов с ограниченным числом потоков.

@Bean
    public Step orderStep1() throws IOException {
        return stepBuilderFactory.get("orderStep1")
                .partitioner("slaveStep", partitioner())
                .step(slaveStep())
                .gridSize(100)
                .taskExecutor(taskExecutor())
                 .build();
    }

Task executor will be
@Bean
    public TaskExecutor taskExecutor() {
        SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
        return taskExecutor;
    }

partitoner will be
public Map<String, ExecutionContext> partition(int gridSize) {

      Map<String, ExecutionContext> partitionData = new HashMap<String, ExecutionContext>();  
      for (int i = 0; i < gridSize; i++) {
            ExecutionContext executionContext = new ExecutionContext();
            executionContext.putString("file", fileList.get(i)); //passing filelist
            executionContext.putString("name", "Thread" + i);
           partitionData.put("partition: " + i, executionContext);
        }

        return partitionData;
    }

и динамически передавать файлы, используя stepExecutionContext

1 Ответ

0 голосов
/ 31 января 2020

если мы используем grid-size = 100, тогда будет 100 потоков, что не логично

Размер сетки и размер пула потоков - это две разные вещи. У вас может быть 100 разделов для обработки, но доступно только 10 рабочих потоков.

Проблема в вашем случае заключается в том, что вы используете SimpleAsyncTaskExecutor, который не использует потоки повторно (см. Его Javado c). Таким образом, для каждого раздела будет создан новый поток, и в итоге вы увидите 100 потоков для 100 разделов.

как решить эту проблему, то есть обработать много файлов с ограниченным числом потоков.

Рассмотрите возможность использования ThreadPoolTaskExecutor , чтобы можно было ограничить число рабочих потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...