0
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 Boot 中使用 tasklet 的示例代码。我的问题是:我想从 中抛出异常afterstep(),但接口不允许。

尽管有这个限制,但我痴迷的原因afterstep()是我想制作抽象类来制作 Tasklet 模板,它可以验证afterstep(). 我希望在execute()完成后运行验证,这将被子类覆盖。所以我别无选择,只能使用afterstep().

任何想法在每次execute()使用可抛出或afterstep()可以将异常传递给之后运行验证方法logExceptionHandler()?我希望logExceptionHandler()TaskletConfiguration课堂上定义。如果在Tasklet类中定义会很胖,因为我会做抽象类,它会被很多子类继承。

4

1 回答 1

0

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 以驱动其余的作业执行流程。

于 2021-09-08T08:14:51.553 回答