如何描述在应用程序启动后和 00:00 之后运行的 Spring 调度程序?
7 回答
我会用两个独立的结构来做到这一点。
对于应用程序启动后,使用@PostConstuct
,对于每晚午夜使用设置@Scheduled
的cron
值。两者都应用于方法。
public class MyClass {
@PostConstruct
public void onStartup() {
doWork();
}
@Scheduled(cron="0 0 0 * * ?")
public void onSchedule() {
doWork();
}
public void doWork() {
// your work required on startup and at midnight
}
}
关于这个主题,你可以使用@EventListener 注解。
这是一个例子:
@Component
public class MyScheduler {
@EventListener(ApplicationReadyEvent.class)
public void onSchedule() {
doWork();
}
public void doWork() {
// your work required on startup
}
}
首先,您应该@EnableScheduling
为您的应用程序配置添加注释。
调度程序的第二个添加@Component
或 @Service 注释。如果您使用Scheduled
注释,它会在初始化后自动运行以更改它,您可以initialDelay
在注释中使用参数。
这是完整的例子
@Component
public class MyScheduler {
@Scheduled(cron="*/10 * * * * *")
public void onSchedule() {
doWork();
}
public void doWork() {
// your work required on startup and at midnight
}
}
我们有多种方法来执行它,@nicholas.hauschild 建议的方法比任何其他方法都正确且容易,但是@PostConstruct
我们必须小心不要使用依赖 bean 的方法。该 bean 可能尚未初始化并导致NullPointerException
.
所以我们可以实现CommandLineRunner
orApplicationRunner
并实现 run 方法,这样在所有 bean 初始化并且应用程序启动后,run 方法将被自动调用。
@Component
public class CommandLineAppStartupRunner implements CommandLineRunner {
@Autowired
private MyClass MyClass;
@Override
public void run(String...args) throws Exception {
myService.doWork();
}
}
好的,据我了解,您希望在应用程序启动后和每个午夜运行您的计划作业。
Spring Scheduler 提供initialDelay
,但您必须将其与fixedDelay
.
这是我的答案:
// it runs after 30 seconds of startup, you will be dead before it runs again.
@Scheduled(initialDelay = 1000 * 30, fixedDelay=Long.MAX_VALUE)
public void runAtStartup(){
doWork();
}
// runs every midgnight (12.00 AM)
@Scheduled(cron="0 0 0 * * ?")
public void onSchedule() {
doWork();
}
了解有关它的更多信息,请点击此链接https://www.baeldung.com/cron-expressions
对于要在午夜完成的特定任务,有一个预定义的注释可以提供帮助,请尝试@midnight
。它应该工作:
@midnight
public void midnightRun(){
doTheWork();
}
public class MyClass {
@PostConstruct
@Scheduled(cron="0 0 0 * * ?")
public void doWork() {
// your work
}
}