终止 @Scheduled Spring Batch 作业
Posted
技术标签:
【中文标题】终止 @Scheduled Spring Batch 作业【英文标题】:Terminating a @Scheduled Spring Batch Job 【发布时间】: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() ...虽然看起来很麻烦...跨度> 好的,谢谢你的详细信息。请参阅我的答案以了解如何操作。希望对您有所帮助。 【参考方案1】:如果(根据标签)猜测您正在使用 Spring Boot。因此,在这种情况下,请注意 boot 会发出一个 JobExecutionEvent
类型的 ApplicationEvent
,并将 JobExecution
作为有效负载。因此,您可以创建一个实现 ApplicationListener<JobExecutionEvent>
的 bean,并在作业失败时优雅地关闭应用程序上下文。
希望这会有所帮助。
【讨论】:
以上是关于终止 @Scheduled Spring Batch 作业的主要内容,如果未能解决你的问题,请参考以下文章