【发布时间】:2018-05-22 22:30:12
【问题描述】:
我在 Spring Batch 中设置了一个有点线性的作业,它由几个步骤组成。如果在任何时候,单个步骤失败,则作业应该失败。
这些步骤由多个 tasklet 和一个基于块的步骤组成。即:
- 步骤 1
- 小任务 1
- 步骤 2
- 小任务 2
- 步骤 3
- 读者
- 处理器
- 作家
如果出现问题,显而易见的做法是抛出异常。 Spring Batch 将处理此问题并记录所有内容。这种行为,尤其是打印堆栈跟踪,是不可取的,如果可以优雅地结束 Job 并将 Status 设置为 FAILED 会更好。
Tasklet 当前直接在StepContribution 上设置ExitStatus。它们也是使用流程构建的(这并不理想,但这些步骤会继续畅通无阻)。然后可以直接在 Tasklet 中处理问题。
但是,在基于块的方法中,我们无法访问StepContribution。我们只有StepExecution。在这里使用 setExitStatus 什么都不做。
我们使用的是构建器(JobBuilerFactory 和 StepBuilderFactory),而不是 XML 设置。
可能的解决方案:
- 告诉或配置 Batch 如何处理异常(而不是打印堆栈跟踪)。
- 在侦听器中捕获异常。不幸的是,Spring Batch 在到达
@AfterStep时已经捕获了异常。 - 告诉步骤/作业我们不想继续(例如,在执行上下文中设置一个值或
StepContribution的替代项。
【问题讨论】:
标签: java spring exception-handling spring-batch chunks