摘要:而我這里定時任務(wù)的觸發(fā)是要通過接口的方式來觸發(fā),所以只用實現(xiàn)以下的調(diào)度器即可。我這里簡單說下任務(wù)的調(diào)度器,具體的任務(wù)類,觸發(fā)器,任務(wù)什么時候執(zhí)行是由它決定的。遇到的坑解決方式這個是因為不兼容的問題,所以使用是不會出現(xiàn)這個錯誤的。
實現(xiàn)定時任務(wù)的幾種方式: 1.使用linux的crontab
優(yōu)點: 1.使用方式很簡單,只要在crontab中寫好 2.隨時可以修改,不需要重啟服務(wù)器 缺點: 1.分布式的系統(tǒng)中不好使用,只能一臺臺機器去修改 2.分是最小的時間單位,秒級的不能使用2.使用spring自帶的ScheduledExecutor
優(yōu)點: cronExpression比crontab的更強大一些支持到秒,性能更好 缺點: 修改了cronExpression的重啟服務(wù)器,否則不生效3. 使用JDK自帶的Timer
優(yōu)點: 輕量級,執(zhí)行速度快 缺點: 分布式系統(tǒng)不好使用.而且不能指定時間執(zhí)行,只能按某個頻次來執(zhí)行4. 使用quartz
優(yōu)點: 1.可適用于分布式系統(tǒng),quartz可支持集群模式 2.修改了定時任務(wù)無須重啟服務(wù)器(這只是我個人想到的一些優(yōu)缺點,網(wǎng)友有其他看法可以留言說下)整合步驟:
我們現(xiàn)在知道了quartz有這么優(yōu)秀,該怎么整合到項目中呢?筆者接下來將實現(xiàn)一個通過http接口調(diào)用來觸發(fā)動態(tài)定時任務(wù)的一個小功能.
筆者使用的環(huán)境:
jdk:1.8.0_162; springboot:1.5.10.RELEASE
1.引入需要的jar包,在pom文件中加入quartz的jar包和spring支持quartz的jar
org.quartz-scheduler quartz 2.3.1 org.springframework spring-context-support
2.配置調(diào)度器的bean,這里spring實現(xiàn)了三個工廠類,SchedulerFactoryBean,CronTriggerBean,JobDetailBean,使用注解的方式將這三個類交給spring管理.一般看網(wǎng)上的資料都是這三個類,都交給spring管理,可以參考這篇文章這篇文章。
????而我這里定時任務(wù)的觸發(fā)是要通過接口的方式來觸發(fā),所以只用實現(xiàn)以下SchedulerFactoryBean的調(diào)度器即可。如果讀者不是很明白這幾個類是干嘛的,可以看下quartz使用的文章。
我這里簡單說下:
scheduler:任務(wù)的調(diào)度器,job:具體的任務(wù)類,trigger:觸發(fā)器,任務(wù)什么時候執(zhí)行是由它決定的。就是說時間人物做什么,scheduler就是主語的人物,trigger是時間,job是做什么事。
@Configuration public class SchedulerConfig { /** * attention: * Details:定義quartz調(diào)度工廠 */ @Bean(name = "scheduler") public SchedulerFactoryBean schedulerFactory() { SchedulerFactoryBean bean = new SchedulerFactoryBean(); // 用于quartz集群,QuartzScheduler 啟動時更新己存在的Job bean.setOverwriteExistingJobs(true); // 延時啟動,應(yīng)用啟動1秒后 bean.setStartupDelay(1); return bean; } }
3.具體任務(wù)類job,必須實現(xiàn)quartz的job類,這個也可以去實現(xiàn)spring的QuartJobBean(spring對job類的實現(xiàn))是一樣的,或者還有一種方式就是MethodInvokingJobDetailFactoryBean,這個類里面可以設(shè)置什么類的什么方法來執(zhí)行這個任務(wù),會更靈活一些:
@Slf4j public class ScheduleTaskJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { log.info("任務(wù)執(zhí)行了......"); } }
4.http的接口來觸發(fā)該調(diào)度程序:
@Slf4j @RestController public class Controller { @Resource(name = "scheduler") private Scheduler scheduler; @PostMapping(value = "/api/executeTask") public String executeTask(TaskVO taskVO) { // job類 JobDetail jobDetail = JobBuilder.newJob(ScheduleTaskJob.class) .withIdentity(taskVO.getJobName(), taskVO.getJobGroupName()) .build(); // 觸發(fā)器類 Trigger trigger = TriggerBuilder.newTrigger() .withIdentity(taskVO.getTriggerName(), taskVO.getTriggerGroupName()) .startNow() .withSchedule(cronSchedule(taskVO.getCronExpression())) .build(); try { // 執(zhí)行任務(wù) scheduler.scheduleJob(jobDetail, trigger); } catch (SchedulerException e) { log.error("任務(wù)執(zhí)行異常", e); } return "success"; } }
5.http接口傳入的值對象,其實就是用來指定job和triger的name和groupName,__name相同的話會失敗,必須是唯一的__,
6.執(zhí)行程序看看效果:
我傳入的參數(shù):
jobName:job1
jobGroupName:jobGroup1
triggerName:trigger1
triggerGroupName:triggerGroup1
cronExpression:0/1 ?
jobName:job2
jobGroupName:jobGroup1
triggerName:trigger2
triggerGroupName:triggerGroup1
cronExpression:0/1 ?
圖中紅色方框上部是只有一個定時任務(wù),每一秒執(zhí)行一次,下部因為又加入了一個新的任務(wù)所以回答引出兩個任務(wù)的執(zhí)行結(jié)果。
1.java.lang.NoSuchMethodError: org.springframework.boot.SpringApplication.run(Ljava/lang/Object;[Ljava/lang/String;)Lorg/springframework/context/ConfigurableApplicationContext;
解決方式:這個是因為springboot2不兼容的問題,所以使用springboot1.5是不會出現(xiàn)這個錯誤的。
2.Caused by: java.lang.ClassNotFoundException: org.springframework.transaction.PlatformTransactionManager
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_162] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_162] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338) ~[na:1.8.0_162] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_162] 39 common frames omitted 啟動的時候如果報這個錯的話,要引入一個spring-tx事物的包
源碼地址:github源碼地址,朋友們覺得寫得還行的幫忙star個,follower下,23333,感謝~ 參考資料:org.springframework spring-tx
[1]https://blog.csdn.net/liuchua...
[2]https://www.w3cschool.cn/quar...
[3]https://www.ibm.com/developer...
[4]http://www.quartz-scheduler.org/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77646.html
摘要:本文使用實現(xiàn)對定時任務(wù)的增刪改查啟用停用等功能。并把定時任務(wù)持久化到數(shù)據(jù)庫以及支持集群。決定什么時候來執(zhí)行任務(wù)。定義的是任務(wù)數(shù)據(jù),而真正的執(zhí)行邏輯是在中。封裝定時任務(wù)接口添加一個暫停恢復(fù)刪除修改暫停所有恢復(fù)所有 簡介 Quartz是一款功能強大的任務(wù)調(diào)度器,可以實現(xiàn)較為復(fù)雜的調(diào)度功能,如每月一號執(zhí)行、每天凌晨執(zhí)行、每周五執(zhí)行等等,還支持分布式調(diào)度。本文使用Springboot+Myba...
閱讀 2383·2021-11-24 10:26
閱讀 2583·2021-11-16 11:44
閱讀 1701·2021-09-22 15:26
閱讀 3576·2021-09-10 11:11
閱讀 3189·2021-09-07 10:25
閱讀 3626·2021-09-01 10:41
閱讀 1011·2021-08-27 13:11
閱讀 3508·2021-08-16 11:02