如何描述在应用程序启动后和00:00之后运行的Spring调度程序?
答案 0 :(得分:25)
我会用两个独立的结构来做到这一点。
对于应用程序启动后,请使用@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
}
}
答案 1 :(得分:2)
首先,您应该为应用程序配置添加@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
}
}
答案 2 :(得分:1)
有关此主题的一些知识,可以使用@EventListener批注。
这里是一个例子:
@Component
public class MyScheduler {
@EventListener(ApplicationReadyEvent.class)
public void onSchedule() {
doWork();
}
public void doWork() {
// your work required on startup
}
}
答案 3 :(得分:0)
了解更多信息,请点击此链接https://www.baeldung.com/cron-expressions
对于要在午夜完成的特定任务,有一个预定义的注释可以提供帮助,请尝试@midnight
。它应该可以工作:
@midnight
public void midnightRun(){
doTheWork();
}
答案 4 :(得分:0)
我们有多种方法来执行它,@nicholas.hauschild 建议的方法比任何其他方法都正确且容易,但是使用 @PostConstruct
我们必须小心不要使用依赖 bean 的方法.该 bean 可能尚未初始化并导致 NullPointerException
。
因此我们可以实现CommandLineRunner
或ApplicationRunner
并实现run方法,因此在所有bean初始化并启动应用程序后,run方法将自动调用。
@Component
public class CommandLineAppStartupRunner implements CommandLineRunner {
@Autowired
private MyClass MyClass;
@Override
public void run(String...args) throws Exception {
myService.doWork();
}
}
答案 5 :(得分:-2)
public class MyClass {
@PostConstruct
@Scheduled(cron="0 0 0 * * ?")
public void doWork() {
// your work
}
}