日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

quart动态执行定时任务

發布時間:2024/4/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 quart动态执行定时任务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天有個需求,前端可以將定時任務自定義保存到數據庫,每天根據查詢數據庫來執行任務。

其實不用動態也是可以實現,但是。也是想試試動態執行定時任務看看怎么樣的。

(1)建立一個QuartzManage類

package com.bsoft.homecare.schedule;import org.quartz.*;/*** @auther: wujj* @date: 2018/8/20 14:25* @description:*/ public class QuartzManager {private Scheduler scheduler;/*** @Description: 添加一個定時任務** @param jobName 任務名* @param jobGroupName 任務組名* @param triggerName 觸發器名* @param triggerGroupName 觸發器組名* @param jobClass 任務* @param cron 時間設置,參考quartz說明文檔*/@SuppressWarnings({ "unchecked", "rawtypes" })public void addJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName, Class jobClass, String cron) {try {// 任務名,任務組,任務執行類JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();// 觸發器TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 觸發器名,觸發器組triggerBuilder.withIdentity(triggerName, triggerGroupName);triggerBuilder.startNow();// 觸發器時間設定triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 創建Trigger對象CronTrigger trigger = (CronTrigger) triggerBuilder.build();// 調度容器設置JobDetail和Triggerscheduler.scheduleJob(jobDetail, trigger);// 啟動if (!scheduler.isShutdown()) {scheduler.start();}} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 修改一個任務的觸發時間** @param jobName* @param jobGroupName* @param triggerName 觸發器名* @param triggerGroupName 觸發器組名* @param cron 時間設置,參考quartz說明文檔*/public void modifyJobTime(String jobName,String jobGroupName, String triggerName, String triggerGroupName, String cron) {try {TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);if (trigger == null) {return;}String oldTime = trigger.getCronExpression();if (!oldTime.equalsIgnoreCase(cron)) {/** 方式一 :調用 rescheduleJob 開始 */// 觸發器TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();// 觸發器名,觸發器組triggerBuilder.withIdentity(triggerName, triggerGroupName);triggerBuilder.startNow();// 觸發器時間設定triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));// 創建Trigger對象trigger = (CronTrigger) triggerBuilder.build();// 方式一 :修改一個任務的觸發時間scheduler.rescheduleJob(triggerKey, trigger);/** 方式一 :調用 rescheduleJob 結束 *//** 方式二:先刪除,然后在創建一個新的Job *///JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(jobName, jobGroupName));//Class<? extends Job> jobClass = jobDetail.getJobClass();//removeJob(jobName, jobGroupName, triggerName, triggerGroupName);//addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);/** 方式二 :先刪除,然后在創建一個新的Job */}} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 移除一個任務** @param jobName* @param jobGroupName* @param triggerName* @param triggerGroupName*/public void removeJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName) {try {TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);scheduler.pauseTrigger(triggerKey);// 停止觸發器scheduler.unscheduleJob(triggerKey);// 移除觸發器scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 刪除任務} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description:啟動所有定時任務*/public void startJobs() {try {scheduler.start();} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description:關閉所有定時任務*/public void shutdownJobs() {try {if (!scheduler.isShutdown()) {scheduler.shutdown();}} catch (Exception e) {throw new RuntimeException(e);}}public Scheduler getScheduler() {return scheduler;}public void setScheduler(Scheduler scheduler) {this.scheduler = scheduler;}}

 (2)配置一個MySchedule1 的定時任務

/*** @auther: wujj* @date: 2018/8/20 15:02* @description:*/ public class MySchedule1 implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println(new Date() + ": ========job 111111 doing something...");} }

?(3)定時任務起始類

import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException;import java.util.Date;/*** @auther: wujj* @date: 2018/8/20 15:02* @description:*/ public class MySchedule implements Job {public void doSomething(){System.out.println(new Date() + ": job master Online...");}@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("job doing something...");}}

  

(4)測試類

/*** @auther: wujj* @date: 2018/8/20 15:06* @description:*/ public class testJob {public static void main(String[] args) throws BeansException {ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-quartz.xml");QuartzManager quartzManager = (QuartzManager) ctx.getBean("quartzManager");try {System.out.println("===============【系統啟動】===============");Thread.sleep(5000);System.out.println("【增加job1啟動】開始(每1秒輸出一次)...");quartzManager.addJob("test", "test", "test", "test", MySchedule1.class, "0/1 * * * * ?");Thread.sleep(10000);System.out.println("【修改job1時間】開始(每3秒輸出一次)...");quartzManager.modifyJobTime("test", "test", "test", "test", "0/3 * * * * ?");Thread.sleep(20000);System.out.println("【移除job1定時】開始...");quartzManager.removeJob("test", "test", "test", "test");Thread.sleep(5000);System.out.println("【增加job2啟動】開始(每1秒輸出一次)...");quartzManager.addJob("test", "test", "test", "test", MySchedule1.class, "0/1 * * * * ?");Thread.sleep(15000);// 關掉任務調度容器quartzManager.shutdownJobs();} catch (Exception e) {e.printStackTrace();}} }

  (5)配置文件:

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"default-lazy-init="true"><!-- 這個類用來做需要完成的業務--><bean id="mySchedule" class="com.bsoft.homecare.schedule.MySchedule"/><!-- 定時任務 --><bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 調用的類 --><property name="targetObject" ref="mySchedule" /><!-- 調用類中的方法 --><property name="targetMethod" value="doSomething" /><!-- 是否并發 --><property name ="concurrent" value ="false" /></bean><!-- 定義觸發時間 ,這邊就不同了,這里必須將時間設置成無限長,因為我們要去讀取數據庫的時間來做為定時器的觸發時間--><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean "><property name="jobDetail" ref="jobtask" /><!-- cron表達式 --><!--每小時執行一次 --><property name="cronExpression" value="0 0 * * * ? *" /></bean><!-- 總管理類 如果將lazy-init='false'那么容器啟動就會執行調度程序 --><bean id="startQuertz" lazy-init="true" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger" /></list></property></bean><!--這個類是用來設置觸發時間的, startJobs方法啟動調度容器,然后按照上面觸發器每隔1s執行所配置的myJob2.doSomething()方法 --><bean id="quartzManager" class="com.bsoft.homecare.schedule.QuartzManager" lazy-init="false" init-method="startJobs" ><!--這個對象一定要注入,這樣類才能進行管理,還有在類型要用get set方法,不然會報錯。--><property name="scheduler" ref="startQuertz" /></bean></beans>

  

轉載于:https://www.cnblogs.com/tuanz/p/9512371.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的quart动态执行定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。