gpt4 book ai didi

spring - 在每个 Spring 计划(@Scheduled)运行之前重置状态

转载 作者:行者123 更新时间:2023-12-02 00:51:46 26 4
gpt4 key购买 nike

我有一个需要每天运行的 Spring Boot Batch 应用程序。它每天读取一个文件,对其数据进行一些处理,并将处理后的数据写入数据库。在此过程中,应用程序保持一些状态,例如要读取的文件(存储在 FlatFileItemReaderJobParameters 中)、当前运行日期和时间、一些文件用于阅读项目之间比较的数据等。

调度的一种选择是使用 Spring 的 @Scheduled,例如:

@Scheduled(cron = "${schedule}")
public void runJob() throws Exception {
jobRunner.runJob(); //runs the batch job by calling jobLauncher.run(job, jobParameters);
}

这里的问题是在运行之间保持状态。所以,我不得不更新要读取的文件,当前运行的日期和时间,清除缓存的文件数据等。

另一种选择是通过 unix cron 作业运行应用程序。这显然会满足在运行之间清除状态的需要,但我更喜欢将作业调度绑定(bind)到应用程序而不是操作系统(并且更喜欢它与操作系统无关)。可以在 @Scheduled 运行之间重置应用程序状态吗?

最佳答案

您始终可以将执行您的任务(更重要的是,保持您的状态)的代码移动到原型(prototype)范围的 bean 中。然后,每次运行预定方法时,您都可以从应用程序上下文中检索该 bean 的新实例。

例子

我创建了一个 GitHub包含我正在谈论的工作示例的存储库,但它的要点在这两个类中:

ScheduledTask.java

注意 @Scope 注释。它指定此组件不应是单例。 randomNumber 字段表示我们希望在每次调用时重置的状态。 “重置”在这种情况下意味着生成一个新的随机数,只是为了表明它确实发生了变化。

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
class ScheduledTask {

private double randomNumber = Math.random();

void execute() {
System.out.printf(
"Executing task from %s. Random number is %f%n",
this,
randomNumber
);
}
}

TaskScheduler.java

通过在 ApplicationContext 中 Autowiring ,您可以在 scheduledTask 方法中使用它来检索 ScheduledTask 的新实例。

@Component
public class TaskScheduler {

@Autowired
private ApplicationContext applicationContext;

@Scheduled(cron = "0/5 * * * * *")
public void scheduleTask() {
ScheduledTask task = applicationContext.getBean(ScheduledTask.class);
task.execute();
}
}

输出

运行代码时,下面是一个示例:

Executing task from com.thomaskasene.example.schedule.reset.ScheduledTask@329c8d3d. Random number is 0.007027
Executing task from com.thomaskasene.example.schedule.reset.ScheduledTask@3c5b751e. Random number is 0.145520
Executing task from com.thomaskasene.example.schedule.reset.ScheduledTask@3864e64d. Random number is 0.268644

关于spring - 在每个 Spring 计划(@Scheduled)运行之前重置状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39150879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com