我的应用程序中有一个@Scheduled
任务,使用CRON
设置并每4小时运行一次。我面临的问题是CRON
作业在应用程序启动后没有立即启动,但它仅在应用程序启动后4小时启动。
我尝试在任务中使用@PostConstruct
方法来调用它,但由于未初始化的Spring上下文而导致错误。
请告诉我如何在应用程序部署时立即运行计划任务,然后在部署后每4小时运行一次。
修改
我不会使用@PostConstruct
,因为我的预定方法依赖于其他Beans,当这个PostConstruct方法由于某种原因运行时,它们没有被初始化。
答案 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
对于固定延迟和固定速率任务,可以指定初始延迟,指示在第一次执行该方法之前等待的毫秒数。
@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