【发布时间】: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