Spring 批处理 运行 在 afterstep() 中完成每个 tasklet 之后的异常抛出方法

Spring batch run exception throwable method after each tasklet done in afterstep()

public class TaskletConfiguration {

  ...

  @Bean
  public Step step() {
    return steps.get("step")
        .tasklet(tasklet)
        .exceptionHandler(logExceptionHandler()) // Handler for logging exception to specific channel
        .build();
  }

  @Bean
  public Job job() {
    return jobs.get("job")
        .start(step())
        .build();
  }
}

public class ExampleTasklet implements Tasklet, StepExecutionListener {

  ...

  @Override
  public RepeatStatus execute(...) throws Exception {
    // Do my tasklet
    // Throw if it fails, and be handled by logExceptionHandler()
  }

  @Override
  public ExitStatus afterStep(StepExecution stepExecution) {
    // Want to throw so that logExceptionHandler() can handle it as throwing in execute().
    throwable_function();
  }
}

这是我在 spring 启动时使用 tasklet 的示例代码。 我的问题是:我想从 afterstep() 中抛出异常,但接口不允许。

尽管有这个限制,但我之所以痴迷于afterstep()是因为我想抽象class来制作Tasklet模板,可以验证afterstep()中的每个执行。我想在所有 execute() 完成后验证到 运行,这将被 subclass 覆盖。所以我别无选择,只能使用 afterstep().

在每个 execute() with throwable 或 afterstep() 可以将 Exception 传递给 logExceptionHandler() 之后,有没有关于 运行 验证方法的想法?我希望在TaskletConfigurationclass中定义logExceptionHandler()。如果定义在Taskletclass里面就胖了,因为我会做abstractclass,会被很多子class继承。

StepExecutionListener#afterStep 不是为了抛出已检查的异常而设计的。这是其 Javadoc 的摘录:

Called after execution of step's processing logic (both successful or failed).
Throwing exception in this method has no effect, it will only be logged.

此外,即使您在 afterStep 中抛出(运行时)异常,异常也不会传递给异常处理程序,它只会按照 Javadoc 中的说明进行记录。

我认为在StepExecutionListener#afterStep中抛出异常为时已晚,此方法可用于检查步骤执行的状态并在需要时修改 ExitStatus 以驱动其余的作业执行流程。