2016-08-24 121 views
0

我有3个步骤的工作(类似步骤1):Spring批处理Java配置:跳过步骤,例外并转到下一步

@Autowired 
private StepBuilderFactory stepBuilderFactory; 

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

如何走,即使在第1步异常后,执行步骤2和3?我的意思是用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到失败步骤3 - 从步骤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,否则:完成 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

你可以在你的脚步

@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()开始使用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()); 
    } 
} 

然后。添加侦听器不是必需的。如果添加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