Spring 批次:在 afterJob 中获取 exitStatusDescription
Spring batch: get exitStatusDescription in afterJob
我是 Spring 批次的新手。
我用这个作业配置了一个新项目:
@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 的 class 中获取错误描述?
@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() -> ""
}
}
将步骤的退出状态设置为 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
}
我是 Spring 批次的新手。 我用这个作业配置了一个新项目:
@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 的 class 中获取错误描述?
@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() -> ""
}
}
将步骤的退出状态设置为 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
}