应用程序启动后和午夜后运行的Spring调度程序

时间:2013-05-04 18:33:37

标签: spring cron scheduling

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

6 个答案:

答案 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

因此我们可以实现CommandLineRunnerApplicationRunner并实现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 
    }
}