您好,登錄后才能下訂單哦!
在 Spring + SpringMVC 環(huán)境中,一般來說,要實(shí)現(xiàn)定時(shí)任務(wù),我們有兩中方案,一種是使用 Spring 自帶的定時(shí)任務(wù)處理器 @Scheduled 注解,另一種就是使用第三方框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具備這兩個(gè) Spring 中的定時(shí)任務(wù)實(shí)現(xiàn)策略,當(dāng)然也支持 Quartz,本文我們就來看下 Spring Boot 中兩種定時(shí)任務(wù)的實(shí)現(xiàn)方式。
@Scheduled
使用 @Scheduled 非常容易,直接創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,并且添加 web 依賴 spring-boot-starter-web,項(xiàng)目創(chuàng)建成功后,添加 @EnableScheduling 注解,開啟定時(shí)任務(wù):
@SpringBootApplication @EnableScheduling public class ScheduledApplication { public static void main(String[] args) { SpringApplication.run(ScheduledApplication.class, args); } }
接下來配置定時(shí)任務(wù):
@Scheduled(fixedRate = 2000) public void fixedRate() { System.out.println("fixedRate>>>"+new Date()); } @Scheduled(fixedDelay = 2000) public void fixedDelay() { System.out.println("fixedDelay>>>"+new Date()); } @Scheduled(initialDelay = 2000,fixedDelay = 2000) public void initialDelay() { System.out.println("initialDelay>>>"+new Date()); }
上面這是一個(gè)基本用法,除了這幾個(gè)基本屬性之外,@Scheduled 注解也支持 cron 表達(dá)式,使用 cron 表達(dá)式,可以非常豐富的描述定時(shí)任務(wù)的時(shí)間。cron 表達(dá)式格式如下:
[秒] [分] [小時(shí)] [日] [月] [周] [年]
具體取值如下:
序號 | 說明 | 是否必填 | 允許填寫的值 | 允許的通配符 |
---|---|---|---|---|
1 | 秒 | 是 | 0-59 | - * / |
2 | 分 | 是 | 0-59 | - * / |
3 | 時(shí) | 是 | 0-23 | - * / |
4 | 日 | 是 | 1-31 | - * ? / L W |
5 | 月 | 是 | 1-12 or JAN-DEC | - * / |
6 | 周 | 是 | 1-7 or SUN-SAT | - * ? / L # |
7 | 年 | 否 | 1970-2099 | - * / |
這一塊需要大家注意的是,月份中的日期和星期可能會(huì)起沖突,因此在配置時(shí)這兩個(gè)得有一個(gè)是 ?
通配符含義:
例如,在 @Scheduled 注解中來一個(gè)簡單的 cron 表達(dá)式,每隔5秒觸發(fā)一次,如下:
@Scheduled(cron = "0/5 * * * * *") public void cron() { System.out.println(new Date()); }
上面介紹的是使用 @Scheduled 注解的方式來實(shí)現(xiàn)定時(shí)任務(wù),接下來我們再來看看如何使用 Quartz 實(shí)現(xiàn)定時(shí)任務(wù)。
Quartz
一般在項(xiàng)目中,除非定時(shí)任務(wù)涉及到的業(yè)務(wù)實(shí)在是太簡單,使用 @Scheduled 注解來解決定時(shí)任務(wù),否則大部分情況可能都是使用 Quartz 來做定時(shí)任務(wù)。在 Spring Boot 中使用 Quartz ,只需要在創(chuàng)建項(xiàng)目時(shí),添加 Quartz 依賴即可:
項(xiàng)目創(chuàng)建完成后,也需要添加開啟定時(shí)任務(wù)的注解:
@SpringBootApplication @EnableScheduling public class QuartzApplication { public static void main(String[] args) { SpringApplication.run(QuartzApplication.class, args); } }
Quartz 在使用過程中,有兩個(gè)關(guān)鍵概念,一個(gè)是JobDetail(要做的事情),另一個(gè)是觸發(fā)器(什么時(shí)候做),要定義 JobDetail,需要先定義 Job,Job 的定義有兩種方式:
第一種方式,直接定義一個(gè)Bean:
@Component public class MyJob1 { public void sayHello() { System.out.println("MyJob1>>>"+new Date()); } }
關(guān)于這種定義方式說兩點(diǎn):
第二種定義方式,則是繼承 QuartzJobBean 并實(shí)現(xiàn)默認(rèn)的方法:
public class MyJob2 extends QuartzJobBean { HelloService helloService; public HelloService getHelloService() { return helloService; } public void setHelloService(HelloService helloService) { this.helloService = helloService; } @Override protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { helloService.sayHello(); } } public class HelloService { public void sayHello() { System.out.println("hello service >>>"+new Date()); } }
和第1種方式相比,這種方式支持傳參,任務(wù)啟動(dòng)時(shí),executeInternal 方法將會(huì)被執(zhí)行。
Job 有了之后,接下來創(chuàng)建類,配置 JobDetail 和 Trigger 觸發(fā)器,如下:
@Configuration public class QuartzConfig { @Bean MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() { MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean(); bean.setTargetBeanName("myJob1"); bean.setTargetMethod("sayHello"); return bean; } @Bean JobDetailFactoryBean jobDetailFactoryBean() { JobDetailFactoryBean bean = new JobDetailFactoryBean(); bean.setJobClass(MyJob2.class); JobDataMap map = new JobDataMap(); map.put("helloService", helloService()); bean.setJobDataMap(map); return bean; } @Bean SimpleTriggerFactoryBean simpleTriggerFactoryBean() { SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean(); bean.setStartTime(new Date()); bean.setRepeatCount(5); bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject()); bean.setRepeatInterval(3000); return bean; } @Bean CronTriggerFactoryBean cronTrigger() { CronTriggerFactoryBean bean = new CronTriggerFactoryBean(); bean.setCronExpression("0/10 * * * * ?"); bean.setJobDetail(jobDetailFactoryBean().getObject()); return bean; } @Bean SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean bean = new SchedulerFactoryBean(); bean.setTriggers(cronTrigger().getObject(), simpleTriggerFactoryBean().getObject()); return bean; } @Bean HelloService helloService() { return new HelloService(); } }
關(guān)于這個(gè)配置說如下幾點(diǎn):
全部定義完成后,啟動(dòng) Spring Boot 項(xiàng)目就可以看到定時(shí)任務(wù)的執(zhí)行了。
總結(jié)
這里主要向大家展示了 Spring Boot 中整合兩種定時(shí)任務(wù)的方法,整合成功之后,剩下的用法基本上就和在 SSM 中使用一致了,不再贅述。
以上所述是小編給大家介紹的Spring Boot 中實(shí)現(xiàn)定時(shí)任務(wù)的兩種方式詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對億速云網(wǎng)站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。