Java 在Spring批处理中使用侦听器捕捉步骤中的错误

Java 在Spring批处理中使用侦听器捕捉步骤中的错误,java,spring,spring-batch,Java,Spring,Spring Batch,我对Spring和Spring Batch是新手。我写了一个基本的作业,应该每5秒重复一次。它有两个步骤,第一个步骤(step1)应该每次都失败。我的目标是查看作业是否会在step1中报告这些错误,并继续执行step2。下面是我用来捕获step1中错误的方法(使用listeners)。我想批评一下我的方法有多正确/错误 这是我的作业配置。它有一个作业,它有两个步骤: @Configuration public class JobConfig { @Autowired priva

我对Spring和Spring Batch是新手。我写了一个基本的作业,应该每5秒重复一次。它有两个步骤,第一个步骤(
step1
)应该每次都失败。我的目标是查看作业是否会在
step1
中报告这些错误,并继续执行
step2
。下面是我用来捕获
step1
中错误的方法(使用
listener
s)。我想批评一下我的方法有多正确/错误

这是我的作业配置。它有一个作业,它有两个步骤:

@Configuration
public class JobConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private JobRepository jobRepository;

    @Autowired
    private StepExecutionListenerImpl stepExecutionListener;

    @Bean
    public Step step1() {
        return stepBuilderFactory.get("step1")
                .listener(this.stepExecutionListener)
                .tasklet(new Tasklet() throws Exception {
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                        throw new Exception("Step1 caused an exception");
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

    @Bean
    public Step step2() {
        return stepBuilderFactory.get("step2")
                .tasklet(new Tasklet() {
                    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws InterruptedException {
                        System.out.println("Step2 is executing");
                        return RepeatStatus.FINISHED;
                    }
                })
                .build();
    }

    @Bean
    public Job job() throws Exception {
        return jobBuilderFactory.get("job")
                .incrementer(new RunIdIncrementer())
                .start(step1())
                .on("COMPLETED").to(step2()).end()
                .build();
    }

    @Scheduled(cron = "*/5 * * * * *")
    public void runJob() throws Exception {

        System.out.println("Job Started at :" + new Date());

        JobParameters param = new JobParametersBuilder().addString("JobID", String.valueOf(System.currentTimeMillis()))
                .toJobParameters();

        JobExecution execution = jobLauncher.run(job(), param);

        System.out.println("Job finished with status :" + execution.getStatus());
    }

   @Bean
    public JobLauncher getJobLauncher() {
       SimpleJobLauncher simpleJobLauncher = new SimpleJobLauncher();
       simpleJobLauncher.setJobRepository(this.jobRepository);
       return simpleJobLauncher;
    }
}
为了在
步骤1
中导致错误,我在该步骤中抛出了一个异常。我还在
step1
中添加了一个
listener
,它的
afterStep()
方法检查在该步骤中是否发生了异常,如果是,则返回
ExitStatus.FAILED
。如果没有出现异常,则返回
ExitStatus.COMPLETED
。以下是代码:

@Component
public class StepExecutionListenerImpl implements StepExecutionListener {

    @Override
    public void beforeStep(StepExecution stepExecution) {
        System.out.println("Before starting step");
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        List<Throwable> exceptions = stepExecution.getFailureExceptions();
        if(exceptions.isEmpty()) {
            return ExitStatus.COMPLETED;
        } else {
            System.out.println("This step has encountered exceptions");
            exceptions.forEach(th -> System.out.println("Exception has occurred in job"));
            return ExitStatus.FAILED;
        }
    }
}
@组件
公共类StepExecutionListenerImpl实现StepExecutionListener{
@凌驾
预处理前的公共无效(步骤执行步骤执行){
System.out.println(“开始步骤前”);
}
@凌驾
公共出口状态后步骤(步骤执行步骤执行){
列表异常=步骤执行。getFailureExceptions();
if(exceptions.isEmpty()){
返回ExitStatus.COMPLETED;
}否则{
System.out.println(“此步骤遇到异常”);
exceptions.forEach(th->System.out.println(“作业中发生异常”);
返回ExitStatus.FAILED;
}
}
}

这似乎是可行的,因为
step1
在作业的每次迭代中都失败,然后新的迭代开始。所以我的问题是,这是捕捉Spring批处理作业中错误的好方法吗?我是否正确使用了侦听器?

我们已经实现了
ItemReadListener
ItemProcessListener
ItemWriteListener
接口,其中包含
onReadError
onProcessError
onWriteError
等方法。如果在读取/处理/写入记录的过程中出现任何异常,将调用这些方法