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

ohtdti5x  于 2023-01-29  发布在  Spring
关注(0)|答案(8)|浏览(166)

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

f2uvfpb9

f2uvfpb91#

我会用两个独立的结构来做这个。
对于应用程序启动后的情况,使用@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
    }
}
iih3973s

iih3973s2#

关于这个主题,您可以使用@EventListener注解。
下面是一个例子:

@Component
public class MyScheduler {

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

    public void doWork() {
        // your work required on startup
    }
}
lf5gs5x2

lf5gs5x23#

首先,您应该为应用程序配置添加@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
    }
}
c0vxltue

c0vxltue4#

我们有多种方法来执行它,@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();

        }
    }
qzwqbdag

qzwqbdag5#

好的,据我所知,你想运行你的时间表作业,一旦应用程序启动,并在每个午夜。
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();
}
mwkjh3gx

mwkjh3gx6#

尼古拉斯·豪斯柴尔德和菲利普·吉伯特的解决方案的组合。理由:@PostConstruct可能不是您想要的,因为您可能需要其他尚未启动的服务。

public class MyClass {

    @EventListener(ApplicationReadyEvent.class)
    @Scheduled(cron="0 0 0 * * ?")
    public void onSchedule() {
        doWork();
    }

    public void doWork() {
        // your work required on startup and at midnight
    } 
  
}
6qfn3psc

6qfn3psc7#

了解更多信息请点击此链接https://www.baeldung.com/cron-expressions
对于要在午夜完成的特定任务,有一个预定义的注解可以提供帮助,请尝试@midnight

@midnight
    public void midnightRun(){
       doTheWork();
    }
yxyvkwin

yxyvkwin8#

public class MyClass {
    @PostConstruct
    @Scheduled(cron="0 0 0 * * ?")
    public void doWork() {
        // your work 
    }
}

相关问题