2015-09-11 1 views
3

У меня есть 3 шага A, B, C, которые должны выполняться в последовательности A-> B-> C, где B является необязательным. Я должен выполнить шаг B только на основе какого-то условия. Я использую JobExecutionDecider решить следующим образом:Идентификация и выполнение этапа spring-batch (java-config) с использованием JobExecutionDecider

@Bean(name = "decider") 
JobExecutionDecider isStepRequired { 
    return new JobExecutionDecider() { 
     @Override 
     public FlowExecutionStatus decide(final JobExecution jobExecution, final StepExecution stepExecution) { 
      if (condition not satisfied) { 
       // return status to skip step B and go to step C 
       return FlowExecutionStatus.COMPLETED; 
      } 
      // return status to proceed with step B 
      return new FlowExecutionStatus("CONTINUE"); 
     } 
    }; 
} 

и в конфигурации задания, у меня есть следующий фрагмент кода,

@Bean 
Job constructJob(final JobBuilderFactory jobs, final Step a, final Step b, final JobExecutionDecider decider, final Step c) { 
    final JobBuilder jobBuilder = jobs.get("Job"); 
    final JobFlowBuilder builder = jobBuilder.flow(a); 
    builder.from(a).next(decider); 
    builder.from(decider).on("CONTINUE").to(b).next(c); 
    builder.from(decider).on("*").to(c); 
    return builder.build().build(); 

и выше код работает, как я ожидал. Но я не уверен, что это правильный способ сделать это. В основном я ожидаю, что не повторить выполнение шага C.

Я столкнулся с SimpleAsyncTaskExecutor, но я понял, что он используется в сценарии, где нам нужно выполнять параллельную обработку, и в моем случае мне просто нужно выполнить шаг, если условие удовлетворяет.

Мои вопросы: 1. Могу ли я достичь того, чего хочу, используя SimpleAsyncTaskExecutor? Есть ли пример использования SimpleAsyncTaskExecutor с помощью аннотации? 2. Есть ли другой лучший способ сделать то, что я сделал, где я могу избежать вышеупомянутого дублирования?

Любая помощь действительно оценена!

Спасибо заранее, Dhinesh Kumar P

+0

Хотя я не знаю об SimpleAsyncTaskExecutor, я нашел эти альтернативы: [потоков] (http://stackoverflow.com/a/32362705/2375586) и [обходные пути] (http://stackoverflow.com/ а/33267011/2375586) – jmmut

ответ

0

Я не уверен, о том, как ваш код работает правильно - как мне кажется, builder.from(decider).on("*").to(c); будет создавать дубликаты расстрелы пошаговой C.

После STEP - A (в любом статусе), вызывается дешифратор, и если ресификатор возвращает CONTINUE - вы выполняете STEP-B, а затем STEP-C. Если этот ресификатор не возвращается CONTINUE, STEP-C все еще выполняется, так как это не является условным в строке - builder.from(decider).on("CONTINUE").to(b).next(c);

Итак, STEP-C уже выполнил то вы снова вызвали решение и снова выполнили STEP-C в соответствии с линией - builder.from(decider).on("*").to(c);. Вы также должны заметить, что параметр final StepExecution stepExecution будет шагом C, когда на этот раз на этот раз вызывается определитель & не STEP - B.

Сообщите мне, если я что-то не понял.

Также - SimpleAsyncTaskExecutor не предназначен для создания рабочих потоков. Его цель - представить многопоточную/параллельную обработку в вашем задании, когда вы пытаетесь выполнить куски параллельно или пытаетесь параллельно выполнять шаги с разделением.