2017-01-05 7 views
0

Я внедрил весеннюю партию partitioning, и я возвращал Map<String, ExecutionContext> result = new HashMap<>(); из метода partition() Partitioner.Закажите разделенные шаги в Spring Batch

Мое требование состоит в том, чтобы начать ведомые шаги в определенном порядке (порядок внесения на карту result), и этого не происходит выше Map.

Я попытался использовать Map<String, ExecutionContext> result = new LinkedHashMap<>();, и это тоже не полезно - любая нить с карты запускается случайным образом.

Я использую SimpleAsyncTaskExecutor как исполнитель в конфигурации мастер-шага и concurrencyLimit параллельные потоки начинают работу. Если я установил concurrencyLimit=1, то я хочу, чтобы первая нить вставлена ​​в карту result, чтобы начать работу и так далее.

Как я могу реализовать этот заказ?

+0

Разделение не предназначено для обеспечения порядка выполнения работником. Поскольку они должны обрабатываться параллельно, я не уверен, что понимаю, зачем вам это нужно. Если вы можете указать, почему вам нужно запускать их в определенном порядке, мы можем помочь с альтернативой. –

+0

В основном у нас есть 235 клиентов с различным количеством обрабатываемых данных. Нам нужен заказ, потому что мы хотим сначала обрабатывать клиентов с наивысшим счетчиком и так далее. В конечном итоге все клиенты будут обработаны, но мы хотим начать с самого начала N-Threads, чтобы иметь лучшую пропускную способность и не хотим иметь ситуацию, когда несколько тысяч клиентов ждут, когда несколько миллионов клиентов закончат. Каждый подчиненный шаг представляет клиент. –

+0

@MichaelMinella: Я использовал 'LinkedHashMap' в своем разделителе и написал разделитель, как это было предложено в ответе Картика Прасада, и это сделало эту работу. Это правильный подход? –

ответ

2

От взгляда на код вместе с вышеописанным шагом вам может потребоваться переопределить разделение StepExecutionSplitter #, я считаю, что вы можете расширить класс SimpleStepExecutionSplitter и реализовать метод Split, в методе split вам нужно изменить набор, используемый для сбора StepExecution из HashSet в LinkedHashSet , если вы хотите также рассмотреть возможность перезапуска, то вам, возможно, также придется рассмотреть возможность изменения в методе getContexts.

Ниже приведен фрагмент для добавления сплиттера.

stepBuilders.get("partitionStep") 
       .partitioner(slaveStep) 
       .partitioner("myParitionerStep", partitioner) 
       .taskExecutor(new SimpleThreadPoolTaskExecutor()) 
       .splitter(new SimpleStepExecutionSplitter(jobRepository, allowStartIfComplete, stepName, partitioner)) 
       .build() 
+0

или мне нужно предоставить обработчик разделов, похожий на 'org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler', переопределив метод doHandle()' и предоставляем шаг by. .partitionHandler (partitionHandler) '? Обработчик раздела - это один запускающий поток и вызывающий сплиттер. –

+0

Если вы видите код doHandle вызывается дескриптором, в методе дескриптора с использованием сплиттера вы получаете все stepExecution, вам понадобятся эти stepExecutions. Следовательно, Splitter необходимо изменить. –