Spring Scheduled任务不会在应用程序启动时启动

时间:2017-02-15 10:10:13

标签: java spring spring-scheduled

我的应用程序中有一个@Scheduled任务,使用CRON设置并每4小时运行一次。我面临的问题是CRON作业在应用程序启动后没有立即启动,但它仅在应用程序启动后4小时启动。

我尝试在任务中使用@PostConstruct方法来调用它,但由于未初始化的Spring上下文而导致错误。

请告诉我如何在应用程序部署时立即运行计划任务,然后在部署后每4小时运行一次。

修改
我不会使用@PostConstruct,因为我的预定方法依赖于其他Beans,当这个PostConstruct方法由于某种原因运行时,它们没有被初始化。

8 个答案:

答案 0 :(得分:5)

按0 * / 4 * * *指定“每隔4小时0分钟(0:00,4:00,8:00等)”,这不是启动时间,然后每4小时一次我想你想要的。 您可以通过以下方式指定初始延迟和费率:

@Scheduled(initialDelay=0, fixedRate=4*60*60*1000)

如果您担心硬编码值,您仍然可以提供配置值:

@Scheduled(initialDelay=0, fixedRateString = "${some.config.string}")

答案 1 :(得分:2)

我的应用配置中有@EnableScheduling。我有 我的预定任务类中的@Scheduled(fixedDelay=5000)。即使这样它也没有用。

我将@Service添加到我的预定任务类中,一切正常。

答案 2 :(得分:1)

我不确定您是否尝试过此操作,但可以@Scheduled使用initialDelay

  

对于固定延迟和固定速率任务,可以指定初始延迟,指示在第一次执行该方法之前等待的毫秒数。

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-annotation-support-scheduled

@Scheduled(initialDelay=0, fixedRate=5000)
public void doSomething() {
    // something that should execute periodically
}

我认为这将在应用程序运行时执行您的预定方法。

答案 3 :(得分:1)

如果无法将initialDelay属性与cron规则一起使用,并且您的意图是在每次重新启动后执行此作业,则可以在应用程序类上实现CommandLineRunner

@SpringBootApplication
public class MyApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Autowired
    private TaskService taskService;

    @Override
    public void run(final String... args) throws Exception {

        taskService.run();
    }

}

这不是最好的策略,但有效。

答案 4 :(得分:0)

只需在bean的init_method属性中指定要运行的方法。

Java配置:@Bean(init_method="methodWhichStartsTask")

XML配置:<bean id="someId" class="com.example.Clazz" init-method="methodWhichStartsTask"/>

这将在bean正确初始化之后立即调用该方法,如果该方法已被调度,那么它将在每4小时后调用一次。

答案 5 :(得分:0)

在@Scheduled中使用fixedRate而不是cron,如下所示。默认情况下,initialDelay为-1,它将立即启动,或者您可以设置为0.

@Scheduled(fixedRate=4*60*60*1000)
public void test() {
    System.out.println("helloworld");
}

答案 6 :(得分:0)

我也有同样的情况。我需要在每月的第1天以及应用程序启动时运行cron Scheduler。

这就是我使用ApplicationListener实现的方式。

import org.springframework.context.ApplicationListener;
import org.springframework.boot.context.event.ApplicationReadyEvent;

@Component
public class ApplicationReadyListner implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        // callYourTask();
    }
}

答案 7 :(得分:-1)

用户的@EnableScheduling注释,其中包含您的预定方法:

见春文:

  

启用对@Scheduled和@Async注释的支持添加   @EnableScheduling和@EnableAsync到你的@Configuration之一   类:

@Configuration
@EnableAsync
@EnableScheduling
public class AppConfig {
}

link:https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html