SpringBoot提供了任務(wù)調(diào)度功能,可以指定啟動服務(wù)器立刻執(zhí)行某些任務(wù)邏輯,或指定時(shí)間調(diào)用某些任務(wù)邏輯。
Tomcat服務(wù)器啟動立刻執(zhí)行某些任務(wù)
SpringBoot提供了ApplicationRunner和CommandLineRunner接口,實(shí)現(xiàn)任何一個(gè)即可。
1.ApplicationRunner
@Component
@Order(2)
public class MyTask1 implements ApplicationRunner{
? ? @Override
? ? public void run(ApplicationArguments args) throws Exception {
? ? ? ? System.out.println("啟動服務(wù)器自動執(zhí)行任務(wù)1 "+new Date());? } }
2.CommandLineRunner
@Component
@Order(1)
public class MyTask2 implements CommandLineRunner{
? ? @Override
? ? public void run(String... args) throws Exception {
? ? ? ? System.out.println("啟動服務(wù)器自動執(zhí)行任務(wù)2 "+new Date());
? ? ? ? Thread.sleep(3000);
? ? ? ? String s = null;
? ? ? ? s.length(); } }
總結(jié):多個(gè)任務(wù)可以使用@Order定義調(diào)度順序,從1,2,3,4...;多個(gè)任務(wù)采用單線程同步模式執(zhí)行。
如果需要多個(gè)任務(wù)需要異步執(zhí)行調(diào)用,可以使用@EnableAsync和@Async標(biāo)記。
@Component
@EnableAsync
public class MyTask3 {
? ? @Async
? ? public void run1() throws Exception {
? ? ? ? System.out.println("啟動服務(wù)器自動執(zhí)行任務(wù)1 "+new Date());
? ? ? ? Thread.sleep(2000);
? ? ? ? System.out.println("任務(wù)1結(jié)束 "+ new Date());? }
? ? @Async
? ? public void run2() throws Exception {
? ? ? ? System.out.println("啟動服務(wù)器自動執(zhí)行任務(wù)2 "+new Date());
? ? ? ? Thread.sleep(3000);
? ? ? ? System.out.println("任務(wù)2結(jié)束 "+ new Date());? } }
提示:在需要的時(shí)機(jī)注入MyTask3任務(wù)對象,調(diào)用run1、run2方法。
Tomcat服務(wù)器啟動后定時(shí)執(zhí)行任務(wù)調(diào)度
在以前經(jīng)常使用Quartz工具來實(shí)現(xiàn)任務(wù)調(diào)度。后期Spring框架引入Schedule任務(wù)模塊,實(shí)現(xiàn)了任務(wù)調(diào)度功能。(Spring+Quartz、Spring Schedule)
1.Spring Schedule模塊應(yīng)用
@Component
@EnableScheduling
public class MyTask4 {
//? @Scheduled(fixedRate=3000,initialDelay=5000)
//? public void run1() {
//? ? ? System.out.println("執(zhí)行任務(wù)4處理 "+new Date());//? }
//? @Scheduled(fixedRate=1000)
//? public void run2() {
//? ? ? System.out.println("執(zhí)行任務(wù)5處理 "+new Date());//? }
? ? @Scheduled(cron="0/5 * * * * ?")
? ? public void run3() {
? ? ? ? System.out.println("執(zhí)行任務(wù)6處理 "+new Date()); } }
cron表達(dá)式(由7部分構(gòu)成,格式為“秒 分? 時(shí)? 日? 月? 星期? 年”)
2.Spring Quartz整合應(yīng)用
編寫任務(wù)組件
@Component
public class HelloBean{
? ? public void execute() throws JobExecutionException {
? ? ? ? System.out.println("執(zhí)行Quartz任務(wù) " + new Date());? } }
配置JobDetail、CronTrigger、ScheduleFactoryBean組件
@Configuration
public class QuartzConfiguration {
? ? @Autowired
? ? private HelloBean hello;
? ? @Bean//配置jobDetail對象
? ? public MethodInvokingJobDetailFactoryBean helloJobDetail() {
? ? ? ? MethodInvokingJobDetailFactoryBean jobDetailFactoryBean =
? ? ? ? ? ? ? ? ? ? new MethodInvokingJobDetailFactoryBean();?
? ? ? ? ? ? // 是否設(shè)置并發(fā)執(zhí)行?
? ? ? ? ? ? jobDetailFactoryBean.setConcurrent(false);?
? ? ? ? ? ? jobDetailFactoryBean.setTargetObject(hello);?
? ? ? ? ? ? jobDetailFactoryBean.setTargetMethod("execute");?
? ? ? ? ? ? return jobDetailFactoryBean;? }
? ? @Bean
? ? public CronTriggerFactoryBean helloJobTrigger(JobDetail jobDetail) {
? ? ? ? CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();?
? ? ? ? trigger.setCronExpression("0/3 * * * * ?");?
? ? ? ? trigger.setJobDetail(jobDetail);?
? ? ? ? return trigger;? }
? ? @Bean? //可以省略,由QuartzAutoConfiguration自動配置替代
? ? public SchedulerFactoryBean schedulerFactoryBean(Trigger... cornTriggerFacrotyBean) {?
? ? ? ? SchedulerFactoryBean bean = new SchedulerFactoryBean();?
? ? ? ? bean.setSchedulerName("QUARTZ");?
? ? ? ? bean.setTriggers(cornTriggerFacrotyBean);?
? ? ? ? //bean.setStartupDelay(5);?
? ? ? ? return bean;? }? }