2016-08-24 5 views
0

например. У меня есть 3 шага в книге Иова (по аналогии с Step1):Spring Batch Java Config: пропустите шаг при исключении и перейдите к следующим шагам

@Autowired 
private StepBuilderFactory stepBuilderFactory; 

@Bean 
public Step step1() { 
    return stepBuilderFactory 
      .get("step1") 
      .<String, String> chunk(1) 
      .reader(reader()) 
      .processor(processor()) 
      .writer(writer()) 
      .build(); 
} 

Как перейти к шагу 2 и 3, даже после того, как исключение в шаге 1? Я имею в виду конфигурацию на Java.

+0

Может быть, вы хотите попробовать 'StepExecutionListener'. Его 'afterStep' полезен при обработке потока шагов. – Minh

ответ

3

Вот пример того, как настроить его при создании потока. Это должно быть похоже на настройку непосредственно с помощью создателя задания:

return new FlowBuilder<SimpleFlow>("name") 
    .start(step1) // 
    .next(step2).on(ExitStatus.FAILED.getExitCode()).to(errorStep) 
    .from(step2).on(ALL_PATTERN).to(step3) 
    .build(); 
+0

В моем случае, независимо или одно исключение был брошен или нет (на шаге 2), мне всегда нужно перейти к шагу 3. Я буду использовать что-то вроде: - от шага2 от FAIL до step3 - от шага2 до * до шага 3 – Artur

0

Вы можете использовать метод StepBuilder.faultTolerant и настроить xml таким образом.

<batch:skippable-exception-classes> 
        <batch:include class="MyException"/> 
</batch:skippable-exception-classes> 

Это поможет в вашем случае.

Пожалуйста, посмотрите на это: http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/core/step/builder/SimpleStepBuilder.html#faultTolerant--

+0

Я использовал: SkipPolicy и RetryPolicy, но после исключения. Выполнение шага завершено статусом «COMPLETE». Я ожидаю: 1. Шаг1: когда ex, чем exitStatus: FAILED, в противном случае: COMPLETED 2. (независимо от того, что исключение или нет в шаге 1) Step2 3. (независимо от того, что исключение или нет в Step1, Step2) Step3' – Artur

+0

Прочтите эту ссылку: https: //blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-3-skip-and-retry/ – Rishi

1

Вы можете использовать Skip Listener

@Component 
public class CustomSkipListener { 

    @OnSkipInRead 
    public void onSkipInRead(Throwable t) { 
     System.out.println("From onSkipInRead -> " + t.getMessage()); 
    } 

    @OnSkipInWrite 
    public void onSkipInWrite(String item, Throwable t) { 
     System.out.println("From onSkipInWrite: " + item + " -> " + t.getMessage()); 
    } 

    @OnSkipInProcess 
    public void onSkipInProcess(String item, Throwable t) { 
     System.out.println("From onSkipInProcess: " + string + " -> " + t.getMessage()); 
    } 
} 

Затем в шаге

@Bean 
public Step step1(CustomSkipListener customSkipListener) { 
    return stepBuilderFactory 
      .get("step1") 
      .<String, String> chunk(1) 
      .reader(reader()) 
      .processor(processor()) 
      .writer(writer()) 
      .faultTolerant() 
      .skipLimit(10) 
      .skip(RuntimeException.class) 
      .listener(customSkipListener) 
      .build(); 
} 

Обратите внимание на ЦЕПЬ начиная с .faultTolerant(). Добавление слушателя не является обязательным. Если вы добавите listener, вы сможете справиться с поведением при пропуске.

Некоторые полезные ссылки

http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/core/SkipListener.html

http://docs.spring.io/spring-batch/reference/html/configureStep.html#configuringSkip