Spring Boot 配置 Quartz 定時任務的方法
Quartz有四個核心概念:
Job:是一個接口,只定義一個方法 execute(JobExecutionContext context),在實現(xiàn)接口的 execute 方法中編寫所需要定時執(zhí)行的 Job(任務)
Double slongitude = Double.valueOf(jobExecutionContext.getJobDetail().getJobDataMap().get("slongitude").toString());
JobDetail:Quartz 每次調(diào)度 Job 時,都重新創(chuàng)建一個 Job 實例,因此它不接受一個 Job 的實例,相反它接收一個 Job 實現(xiàn)類(JobDetail,描述 Job 的實現(xiàn)類及其他相關(guān)的靜態(tài)信息,如 Job 名字、描述、關(guān)聯(lián)監(jiān)聽器等信息),以便運行時通過 newInstance() 的反射機制實例化 Job。
rigger:是一個類,描述觸發(fā) Job 執(zhí)行的時間觸發(fā)規(guī)則,主要有 SimpleTrigger 和 CronTrigger 這兩個子類。當且僅當需調(diào)度一次或者以固定時間間隔周期執(zhí)行調(diào)度,SimpleTrigger 是最適合的選擇;而 CronTrigger 則可以通過 Cron 表達式定義出各種復雜時間規(guī)則的調(diào)度方案:如工作日周一到周五的 15:00 ~ 16:00 執(zhí)行調(diào)度等。
Scheduler:調(diào)度器就相當于一個容器,裝載著任務和觸發(fā)器,該類是一個接口,代表一個 Quartz 的獨立運行容器,Trigger 和 JobDetail 可以注冊到 Scheduler 中,兩者在 Scheduler 中擁有各自的組及名稱,組及名稱是 Scheduler 查找定位容器中某一對象的依據(jù),Trigger 的組及名稱必須唯一,JobDetail 的組和名稱也必須唯一(但可以和 Trigger 的組和名稱相同,因為它們是不同類型的)。Scheduler 定義了多個接口方法,允許外部通過組及名稱訪問和控制容器中 Trigger 和 JobDetail。
1.導入pom依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
2.開啟定時任務
@EnableScheduling注解
//java fhadmin.cn @EnableScheduling @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
3.新建一個job
@Slf4j public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { try { executeTask(jobExecutionContext); } catch (Exception e) { e.printStackTrace(); } } //java fhadmin.cn private static void executeTask(JobExecutionContext jobExecutionContext) throws SchedulerException { //JobExecutionContext 類提供了調(diào)度應用的一些信息; //Job 運行時的信息保存在 JobDataMap 實例中。 JobKey key = jobExecutionContext.getJobDetail().getKey(); System.out.println(new Date()+"->"+key.toString()+"定時任務正在執(zhí)行"); } }
4.構(gòu)建JobDetailrigger
把Trigger 和 JobDetail 可以注冊到 Scheduler 中
//fhrom fhadmin.cn @Configuration public class QuartzManager { // public static final String JOB1="job1"; // public static final String GROUP1="group1"; /**默認每個星期凌晨一點執(zhí)行*/ //public static final String DEFAULT_CRON="0 0 1 ? * L"; /**默認5秒執(zhí)行一次*/ // public static final String DEFAULT_CRON="*/5 * * * * ?"; /** * 任務調(diào)度 */ private Scheduler scheduler; @Bean public Scheduler scheduler() throws SchedulerException { SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory(); this.scheduler = schedulerFactoryBean.getScheduler(); return schedulerFactoryBean.getScheduler(); } /** * 開始執(zhí)行定時任務 */ public void startJob(String name,String group,String time) throws SchedulerException { startJobTask(scheduler,name,group,time); scheduler.start(); } /** * 啟動定時任務 * @param scheduler */ private void startJobTask(Scheduler scheduler,String name ,String group,String time) throws SchedulerException { //對于身份 JobDetail jobDetail= JobBuilder.newJob(MyJob.class).withIdentity(name,group).build(); System.out.println("jobDetail:-------------"+jobDetail); String DEFAULT_CRON="*/"+time+" * * * * ?"; // SimpleScheduleBuilder CronScheduleBuilder 用于構(gòu)建Scheduler,定義任務調(diào)度的時間規(guī)則 CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(DEFAULT_CRON); //觸發(fā)器 CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity(name,group) .withSchedule(cronScheduleBuilder).build(); scheduler.scheduleJob(jobDetail,cronTrigger); } /** * 獲取Job信息 * @param name * @param group */ public String getjobInfo(String name,String group) throws SchedulerException { TriggerKey triggerKey=new TriggerKey(name,group); System.out.println("triggerKey:"+triggerKey); CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey); return String.format("time:%s,state:%s",cronTrigger.getCronExpression(), scheduler.getTriggerState(triggerKey).name()); } /** * 修改任務的執(zhí)行時間 * @param name * @param group * @param cron cron表達式 * @return * @throws SchedulerException */ public boolean modifyJob(String name,String group,String cron) throws SchedulerException{ Date date=null; TriggerKey triggerKey=new TriggerKey(name, group); CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey); String oldTime=cronTrigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(cron)){ CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(cron); CronTrigger trigger=TriggerBuilder.newTrigger().withIdentity(name,group) .withSchedule(cronScheduleBuilder).build(); date=scheduler.rescheduleJob(triggerKey,trigger); } return date !=null; } /** * 暫停所有任務 * @throws SchedulerException */ public void pauseAllJob()throws SchedulerException{ scheduler.pauseAll(); } /** * 暫停某個任務 * @param name * @param group * @throws SchedulerException */ public void pauseJob(String name,String group)throws SchedulerException{ JobKey jobKey=new JobKey(name,group); JobDetail jobDetail=scheduler.getJobDetail(jobKey); if (jobDetail==null) { return; } scheduler.pauseJob(jobKey); } /** * 恢復所有任務 * @throws SchedulerException */ public void resumeAllJob()throws SchedulerException{ scheduler.resumeAll(); } /** * 恢復某個任務 */ public void resumeJob(String name,String group)throws SchedulerException { JobKey jobKey=new JobKey(name,group); JobDetail jobDetail=scheduler.getJobDetail(jobKey); if (jobDetail==null) { return; } scheduler.resumeJob(jobKey); } /** * 刪除某個任務 * @param name * @param group * @throws SchedulerException */ public void deleteJob(String name,String group)throws SchedulerException{ JobKey jobKey=new JobKey(name, group); JobDetail jobDetail=scheduler.getJobDetail(jobKey); if (jobDetail==null) { return; } scheduler.deleteJob(jobKey); } }
5.編寫Controller
通過調(diào)用接口 可以開始定時任務 結(jié)束定時任務 獲取任務信息
//fhadmin.cn @RestController @RequestMapping("/quartz") public class ModifyCronController { @Autowired private QuartzManager quartzManager; @GetMapping("/modify") public String modify(@RequestParam("job")String job, //job的名稱 @RequestParam("group")String group,//job的組 @RequestParam("time")String time //執(zhí)行定時任務的步長 ) throws SchedulerException { // quartzManager.pauseJob(QuartzManager.JOB1,QuartzManager.GROUP1); quartzManager.startJob(job,group,time); String s = quartzManager.getjobInfo(job, group); System.out.println("job:"+s); return "ok"; } }
到此這篇關(guān)于Spring Boot 配置 Quartz 定時任務的文章就介紹到這了,更多相關(guān)Spring Boot Quartz 定時任務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java編程生產(chǎn)者消費者實現(xiàn)的四種方法
Java生產(chǎn)者和消費者問題是線程安全模型中的經(jīng)典問題:生產(chǎn)者和消費者在同一個時間段共用同一個存儲空間,生產(chǎn)者向存儲空間中添加產(chǎn)品呢,消費者取走產(chǎn)品,當存儲空間為空時,消費者阻塞,當存儲空間滿時,生產(chǎn)者阻塞2021-10-10關(guān)于ArrayList的動態(tài)擴容機制解讀
這篇文章主要介紹了關(guān)于ArrayList的動態(tài)擴容機制解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10淺析springcloud 整合 zipkin-server 內(nèi)存日志監(jiān)控
Zipkin是一款開源的分布式實時數(shù)據(jù)追蹤系統(tǒng)(Distributed Tracking System),其主要功能是聚集來自各個異構(gòu)系統(tǒng)的實時監(jiān)控數(shù)據(jù)。這篇文章主要介紹了springcloud 整合 zipkin-server 內(nèi)存日志監(jiān)控,需要的朋友可以參考下2019-11-11