终止 @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 作业的主要内容,如果未能解决你的问题,请参考以下文章

spring的@scheduled定时怎么加返回值

Spring Boot整合@Scheduled定时计划

使用spring@Scheduled进行任务定时

Spring @Scheduled @Async联合实现调度任务

Spring Boot 每月测试@Scheduled

spring boot @Scheduled未生效原因