终止@Scheduled Spring批处理作业

终止@Scheduled Spring批处理作业,spring,spring-boot,spring-batch,spring-scheduled,Spring,Spring Boot,Spring Batch,Spring Scheduled,我正在努力解决以下问题。我有一个Spring批处理作业,每10分钟通过@Scheduled方法执行一次。如果作业执行失败,我需要终止计划。我知道如何通过 a) 调用ScheduledAnnotationBeanPostProcessor::PostProcessBeforeDestroyment() 或 b) 创建自定义ThreadPoolTaskScheduler,存储ScheduledFutures,然后将其取消() 但在这两种情况下,问题是相同的:大量Spring批处理Transactio

我正在努力解决以下问题。我有一个Spring批处理作业,每10分钟通过
@Scheduled
方法执行一次。如果作业执行失败,我需要终止计划。我知道如何通过
a) 调用ScheduledAnnotationBeanPostProcessor::PostProcessBeforeDestroyment() 或
b) 创建自定义
ThreadPoolTaskScheduler
,存储
ScheduledFutures
,然后将其取消()

但在这两种情况下,问题是相同的:大量Spring批处理
TransactionSystemExceptions
,因为它无法再提交元数据。尽管没有更多的@计划的任务要运行,但应用程序不会终止

有什么想法吗

干杯

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


希望这能有所帮助。

您的JVM是否只按计划方式运行批处理作业?停止Spring应用程序上下文并在作业失败后优雅地关闭JVM对您来说是一种选择吗?@MahmoudBenHassine听起来很完美,但我如何才能实现这一点?@MahmoudBenHassine例如,如果我在JobListener中执行SpringApplication.exit(),我仍然会遇到一些异常。来自数据源的InterruptedException以及一些CannotCreateTransactionException可能是由于SpringBatch试图将元数据写入数据库。。。如果使用ConfigurableApplicationContext.close()也有同样的处理方法,到目前为止,我管理的最好方法是在HikariPoolMXBean上调用softEvictConnections(),直到没有更多的活动连接,然后执行StringApplication.exit()。。。看起来有点黑…好的,谢谢你提供的细节。请看我关于如何做的答案。希望能有帮助。