2015-03-26 3 views
3

Я использую Spring Batch 3.0.3, сконфигурированный с аннотацией для создания пакетного задания, которое повторяет шаг неопределенным количеством раз.Повторение шага x раз в Spring Batch

Мой первый шаг будет считывать в память список элементов, используемых во время повторяющегося шага. Я бы хотел, чтобы повторяющиеся шаги повторялись в этом списке вакансий.

Как настроить мою работу для выполнения одного и того же шага x раз? Я видел примеры в xml шага, указав следующий шаг для запуска. Я думаю, я мог бы указать два шага друг к другу в бесконечном цикле, пока список не будет повторен. Будет ли это работать и есть ли способ сделать это с аннотациями? Ниже приведен мой основной файл конфигурации с некоторым кодом, который не работал.

@ComponentScan(excludeFilters = @Filter(IgnoreDuringScan.class)) 
@EnableAutoConfiguration 
@EnableBatchProcessing 
@Loggable 
public class BatchCrudConfiguration 
{ 
    @Bean 
    public Job batchCRUDJob(JobBuilderFactory jobBuilderFactory, Step[] processSheetSteps) 
    { 
     JobBuilder jobBuilder = jobBuilderFactory.get("batchCRUDJob").incrementer(new RunIdIncrementer()); 
     FlowBuilder<FlowJobBuilder> jobFlowBuilder = jobBuilder.flow(processSheetSteps[0]); 
     for (int i = 1; i < processSheetSteps.length; i++) 
     { 
      jobFlowBuilder = jobFlowBuilder.next(processSheetSteps[i]); 
     } 
     return jobFlowBuilder.end().build(); 
    } 

    @Bean 
    public Step[] processSheetSteps(
      StepBuilderFactory stepBuilderFactory, 
      RawDataReader[] readers, 
      DelegatingWriter writer, 
      DelegatingProcessor processor, 
      @Value("${batchcrud.chunkSize}") int chunkSize) 
    { 
     int numberOfReaders = readers.length; 
     Step[] steps = new Step[numberOfReaders]; 
     for (int i = 0; i < numberOfReaders; i++) 
     { 
      steps[i] = stepBuilderFactory.get("processSheet" + i + "Step").<RawData, DataItem> 
        chunk(chunkSize).reader(readers[i]).processor(processor).writer(writer).build(); 
     } 
     return steps; 
    } 
+0

Если вы включите вашу конфигурацию, мы можем предоставить более конкретный ответ. –

+2

Вы бы не стали Майклом Минеллером, который написал книгу «Весенняя партия», которую я читал прошлой ночью, не так ли? Я добавил код. –

+0

Если книга, которую вы читаете, это Pro Spring Batch ... Я. –

ответ

8

Путь я бы подойти к этому является одним из следующих:

  1. Первый шаг загружает список.
  2. Второй этап обрабатывает элемент в списке.
  3. На втором этапе есть StepExecutionListener, который оценивает, есть ли в списке больше элементов для обработки. Если это так, он возвращает ExitStatus, который соответствует одному и тому же шагу. Если нет, он возвращает ExitStatus, который отображает для завершения задания или продолжения задания (в зависимости от остальной части потока).

Например:

StepExecutionListener

public class MyListener { 

    @Autowired 
    private List myItems; 

    @AfterStep 
    public ExitStatus afterStep(StepExecution stepExecution) { 
     if(myItems.size() > 0) { 
      return new ExitStatus("CONTINUE"); 
     } 
     else { 
      return new ExitStatus("FINISHED"); 
     } 
    } 
} 

Конфигурация Работа

... 
@Bean 
public Step step1() {...} 

@Bean 
public MyListener listener() {..} 

@Bean 
public Step step2(MyListener listener) { 
    return stepBuilder.get("step2") 
       .tasklet(myTasklet()) // Replace this piece as needed 
       .listener(listener).build(); 
} 

@Bean 
public Job job1(Step step1, Step step2) { 
    return jobBuilder.get("job1") 
        .start(step1) 
        .next(step2).on("CONTINUE").to(step2).on("FINISHED").end() 
        .build(); 
} 
... 

Примечание Я не проверял этот код, так что может быть опечаток и т.д.

+0

Спасибо. Это отлично работает, если вы добавите еще один вызов в конец() в компоненте Job. –

+1

Итак, если я хочу продолжить с 'step1', могу ли я вызвать этот .next (step2) .on (" CONTINUE "). To (step1) .on (" FINISHED "). End()'? – irvana

+1

как выполнить множественное выполнение step2 параллельно, а не секвенциально в этом случае, у меня есть список элементов в списке, который может выполняться параллельно –

Смежные вопросы