我是Spring Batch的新手。 我已经通过这项工作配置了一个新项目:
@Configuration
@EnableBatchProcessing
@Log4j2
public class BatchConfiguration {
/* ... */
@Bean
public Job myJob(JobBuilderFactory jobBuilderFactory, Step stepInit, Step stepMain, Step stepReport) {
return jobBuilderFactory.get("myJob").incrementer(new RunIdIncrementer()).start(stepInit).on(ExitStatus.FAILED.getExitCode()).fail().from(stepInit).on("*").to(stepMain).next(stepReport).end().listener(new BatchListener()).build();
}
@Bean
public Step stepInit(StepBuilderFactory stepBuilderFactory) {
return stepBuilderFactory.get("stepInit").tasklet(BatchInitialize.builder().build()).build();
}
/* ... */
}
在BatchInitialize Tasklet中,我定义了一个具有errorDesc的退出状态:
@Builder
@AllArgsConstructor
@Log4j2
public class BatchInitialize implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
/* ... */
if(CONDITION) {
contribution.setExitStatus(new ExitStatus(ExitStatus.FAILED.getExitCode(), "ERROR DESC"));
return RepeatStatus.FINISHED;
}
/* ... */
}
}
如何在实现JobExecutionListener的类中获取错误说明?
@Builder
@AllArgsConstructor
@Log4j2
public class BatchListener implements JobExecutionListener {
@Override
public void beforeJob(JobExecution jobExecution) {
//
}
@Override
public void afterJob(JobExecution jobExecution) {
// jobExecution.getExitStatus().getExitCode() -> FAILED
// jobExecution.getExitStatus().getExitDescription() -> ""
}
}
答案 0 :(得分:1)
将步骤的退出状态设置为FAILED
并返回RepeatStatus.FINISHED
对我来说没有意义。如果Tasklet失败,我将设置其退出状态并引发异常(另一种选择是使用异常的消息并将其设置为ERROR DESC
)。
现在,如果您想在侦听器中获取异常,则可以执行以下操作:
@Override
public void afterJob(JobExecution jobExecution) {
List<Throwable> allExceptions = jobExecution.getAllFailureExceptions();
// get the exception and its message
}
如果要获取特定步骤的存在状态,可以执行以下操作:
@Override
public void afterJob(JobExecution jobExecution) {
List<StepExecution> stepExecutions = jobExecution.getStepExectuions();
// iterate and get the step execution you want then get its exit status
}