【问题标题】:Terminating a @Scheduled Spring Batch Job终止 @Scheduled Spring Batch 作业
【发布时间】:2019-06-10 21:01:29
【问题描述】:

我正在努力解决以下问题。我有一个 Spring Batch Job,它通过 @Scheduled 方法每 10 分钟执行一次。如果作业执行失败,我需要终止计划。我知道如何做到这一点
a) 致电ScheduledAnnotationBeanPostProcessor::postProcessBeforeDestruction()
b) 制作自定义ThreadPoolTaskScheduler,存储ScheduledFutures,然后取消()它们,

但在这两种情况下,问题都是一样的:大量的 Spring Batch TransactionSystemExceptions 因为它不能再提交元数据。尽管没有更多的@Scheduled 任务要运行,但应用程序并没有终止......

有什么想法吗?

干杯!

【问题讨论】:

  • 您的 JVM 是否以计划的方式运行批处理作业?您是否可以选择在作业失败后停止 Spring 应用程序上下文并优雅地关闭 JVM?
  • @MahmoudBenHassine 这听起来很完美,但我该如何实现呢?
  • @MahmoudBenHassine 例如,如果我从 JobListener 中执行 SpringApplication.exit(),我仍然会得到一些异常。来自数据源的 InterruptedException 以及一些 CannotCreateTransactionExceptions 可能是由于 SpringBatch 试图将元数据写入数据库......如果使用 ConfigurableApplicationContext.close()
  • 迄今为止我管理的最好的方法是在 HikariPoolMXBean 上调用 softEvictConnections() 直到没有更多活动连接,然后执行 StringApplication.exit() ...虽然看起来很麻烦...跨度>
  • 好的,谢谢你的详细信息。请参阅我的答案以了解如何操作。希望对您有所帮助。

标签: spring spring-boot spring-batch spring-scheduled


【解决方案1】:

如果(根据标签)猜测您正在使用 Spring Boot。因此,在这种情况下,请注意 boot 会发出一个 JobExecutionEvent 类型的 ApplicationEvent,并将 JobExecution 作为有效负载。因此,您可以创建一个实现 ApplicationListener<JobExecutionEvent> 的 bean,并在作业失败时优雅地关闭应用程序上下文。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 2015-12-05
    • 2021-09-01
    • 1970-01-01
    • 2021-10-20
    • 2019-06-09
    • 2014-12-24
    • 1970-01-01
    相关资源
    最近更新 更多