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()
之后,有没有关于 运行 验证方法的想法?我希望在TaskletConfiguration
class中定义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 以驱动其余的作业执行流程。
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()
之后,有没有关于 运行 验证方法的想法?我希望在TaskletConfiguration
class中定义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 以驱动其余的作业执行流程。