【发布时间】:2017-01-02 05:11:31
【问题描述】:
我有一个需要每天运行的 Spring Boot Batch 应用程序。它读取每日文件,对其数据进行一些处理,并将处理后的数据写入数据库。在此过程中,应用程序会保存一些状态,例如要读取的文件(存储在FlatFileItemReader和JobParameters中)、当前运行的日期和时间、用于比较读取项的一些文件数据等。
调度的一种选择是使用 Spring 的@Scheduled,例如:
@Scheduled(cron = "${schedule}")
public void runJob() throws Exception {
jobRunner.runJob(); //runs the batch job by calling jobLauncher.run(job, jobParameters);
}
这里的问题是在运行之间保持状态。所以,我要更新要读取的文件,当前运行的日期和时间,清除缓存的文件数据等等。
另一种选择是通过 unix cron 作业运行应用程序。这显然可以满足在运行之间清除状态的需要,但我更喜欢将作业调度与应用程序而不是操作系统联系起来(并且更喜欢它而不是与操作系统无关)。可以在@Scheduled 运行之间重置应用程序状态吗?
【问题讨论】:
-
@Thomas Kåsene,@Hansjoerg Wingeier,感谢您的帮助。该方法有效,但我确实有相当数量的具有单例范围的 bean。我想我可以将它们全部更改为
step或prototype范围。这可能是可能的,但与仅使用 unix cron 相比似乎很麻烦。我还研究了通过在主应用程序类中使用预定的静态runJob来刷新上下文。但这无法提供GenericApplicationContext does not support multiple refresh attempts。 -
我已经添加了一个示例,您可以如何处理单例 bean。看看我编辑的例子。
标签: spring spring-boot spring-batch schedule spring-scheduled