18

如何描述在应用程序启动后和 00:00 之后运行的 Spring 调度程序?

4

7 回答 7

47

我会用两个独立的结构来做到这一点。

对于应用程序启动后,使用@PostConstuct,对于每晚午夜使用设置@Scheduledcron值。两者都应用于方法。

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
    }
}
于 2013-05-04T18:58:30.740 回答
9

关于这个主题,你可以使用@EventListener 注解。

这是一个例子:

@Component
public class MyScheduler {

    @EventListener(ApplicationReadyEvent.class)
    public void onSchedule() {
        doWork();
    }

    public void doWork() {
        // your work required on startup
    }
}
于 2018-12-11T08:03:55.383 回答
4

首先,您应该@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
    }
}
于 2016-07-06T13:28:46.283 回答
0

我们有多种方法来执行它,@nicholas.hauschild 建议的方法比任何其他方法都正确且容易,但是@PostConstruct我们必须小心不要使用依赖 bean 的方法。该 bean 可能尚未初始化并导致NullPointerException.

所以我们可以实现CommandLineRunnerorApplicationRunner并实现 run 方法,这样在所有 bean 初始化并且应用程序启动后,run 方法将被自动调用。

   @Component
   public class CommandLineAppStartupRunner implements CommandLineRunner {
        @Autowired
        private MyClass MyClass;

        @Override
        public void run(String...args) throws Exception {
           myService.doWork();

        }
    } 
于 2021-05-19T15:01:44.860 回答
0

好的,据我了解,您希望在应用程序启动后和每个午夜运行您的计划作业。

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();
}

于 2022-02-04T07:47:07.183 回答
-1

了解有关它的更多信息,请点击此链接https://www.baeldung.com/cron-expressions

对于要在午夜完成的特定任务,有一个预定义的注释可以提供帮助,请尝试@midnight。它应该工作:

    @midnight
    public void midnightRun(){
       doTheWork();
    }
于 2019-03-12T09:45:57.530 回答
-1
public class MyClass {
    @PostConstruct
    @Scheduled(cron="0 0 0 * * ?")
    public void doWork() {
        // your work 
    }
}
于 2020-09-17T09:30:57.230 回答