java 動態增加定時任務

直接上代碼

import org.apache.tools.ant.util.DateUtils;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;import java.util.Calendar;
import java.util.Date;/*** @Description: 定時任務管理類* Created by zhangxb on 2017/2/10.*/
public class QuartzManager {private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";/*** @Description: 添加一個定時任務,使用默認的任務組名,觸發器名,觸發器組名** @param jobName*            任務名* @param cls*            任務* @param time*            時間設置,參考quartz說明文檔** @Title: QuartzManager.java*/@SuppressWarnings("unchecked")public static void addJob(String jobName, Class cls, String time,Object params) {try {Scheduler sched = gSchedulerFactory.getScheduler();JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任務名,任務組,任務執行類jobDetail.getJobDataMap().put("params", params);// 觸發器CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 觸發器名,觸發器組trigger.setCronExpression(time);// 觸發器時間設定
            sched.scheduleJob(jobDetail, trigger);// 啟動if (!sched.isShutdown()) {sched.start();}} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 添加一個定時任務** @param jobName*            任務名* @param jobGroupName*            任務組名* @param triggerName*            觸發器名* @param triggerGroupName*            觸發器組名* @param jobClass*            任務* @param time*            時間設置,參考quartz說明文檔**/@SuppressWarnings("unchecked")public static void addJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName, Class jobClass,String time,Object params) {try {Scheduler sched = gSchedulerFactory.getScheduler();JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任務名,任務組,任務執行類jobDetail.getJobDataMap().put("params",params);// 觸發器CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 觸發器名,觸發器組trigger.setCronExpression(time);// 觸發器時間設定
            sched.scheduleJob(jobDetail, trigger);} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 修改一個任務的觸發時間(使用默認的任務組名,觸發器名,觸發器組名)** @param jobName* @param time**/@SuppressWarnings("unchecked")public static void modifyJobTime(String jobName, String time) {try {Scheduler sched = gSchedulerFactory.getScheduler();CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);if (trigger == null) {return;}String oldTime = trigger.getCronExpression();if (!oldTime.equalsIgnoreCase(time)) {JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);Class objJobClass = jobDetail.getJobClass();removeJob(jobName);addJob(jobName, objJobClass, time ,jobDetail.getJobDataMap());}} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 修改一個任務的觸發時間**/public static void modifyJobTime(String triggerName,String triggerGroupName, String time) {try {Scheduler sched = gSchedulerFactory.getScheduler();CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);if (trigger == null) {return;}String oldTime = trigger.getCronExpression();if (!oldTime.equalsIgnoreCase(time)) {CronTrigger ct = (CronTrigger) trigger;// 修改時間
                ct.setCronExpression(time);// 重啟觸發器
                sched.resumeTrigger(triggerName, triggerGroupName);}} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 移除一個任務(使用默認的任務組名,觸發器名,觸發器組名)** @param jobName**/public static void removeJob(String jobName) {try {Scheduler sched = gSchedulerFactory.getScheduler();sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止觸發器sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除觸發器sched.deleteJob(jobName, JOB_GROUP_NAME);// 刪除任務} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description: 移除一個任務**/public static void removeJob(String jobName, String jobGroupName,String triggerName, String triggerGroupName) {try {Scheduler sched = gSchedulerFactory.getScheduler();sched.pauseTrigger(triggerName, triggerGroupName);// 停止觸發器sched.unscheduleJob(triggerName, triggerGroupName);// 移除觸發器sched.deleteJob(jobName, jobGroupName);// 刪除任務} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description:啟動所有定時任務*/public static void startJobs() {try {Scheduler sched = gSchedulerFactory.getScheduler();sched.start();} catch (Exception e) {throw new RuntimeException(e);}}/*** @Description:關閉所有定時任務**/public static void shutdownJobs() {try {Scheduler sched = gSchedulerFactory.getScheduler();if (!sched.isShutdown()) {sched.shutdown();}} catch (Exception e) {throw new RuntimeException(e);}}public static String formatTime(Date date){//0/1 * * * * ?String time = DateUtils.format( date, "s m h d * ?");System.out.println(time);return time;}
}

測試類

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;/*** @Description: 任務執行類* Created by zhangxb on 2017/2/10.*/
public class QuartzJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {Object params =   context.getJobDetail().getJobDataMap().get("params");System.out.println(params);System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+ "★★★★★★★★★★★");System.out.println("【移除定時】開始...");QuartzManager.removeJob((String)params);System.out.println("【移除定時】成功");}public static void main(String[] args) {try {String job_name = "動態任務調度";System.out.println("【系統啟動】開始(每1秒輸出一次)...");Calendar cal = Calendar.getInstance();cal.add( Calendar.SECOND,10);QuartzManager.addJob(job_name, QuartzJob.class, QuartzManager.formatTime(cal.getTime()),job_name);Thread.sleep(11);cal.setTime( new Date());cal.add( Calendar.SECOND,10);QuartzManager.addJob(job_name+1, QuartzJob.class, QuartzManager.formatTime(cal.getTime()),job_name+1);Thread.sleep(11);
//            System.out.println("【修改時間】開始(每2秒輸出一次)...");
//            QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");
//            Thread.sleep(6000);
//            System.out.println("【移除定時】開始...");
//            QuartzManager.removeJob(job_name);
//            System.out.println("【移除定時】成功");
//
//            System.out.println("【再次添加定時任務】開始(每10秒輸出一次)...");
//            QuartzManager.addJob(job_name, QuartzJob.class, "*/10 * * * * ?");
//            Thread.sleep(60000);
//            System.out.println("【移除定時】開始...");
//            QuartzManager.removeJob(job_name);
//            System.out.println("【移除定時】成功");} catch (Exception e) {e.printStackTrace();}}
}

不過最后發現,還是沒法做動態延遲。后面用延時mq實現的。

轉載于:https://www.cnblogs.com/foreverzxb/p/6491190.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372814.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372814.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372814.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于JavaFX的SimpleDateFormat演示程序

對于使用Java Date進行格式化的新手甚至對于使用Java Date進行格式化的有經驗的Java開發人員而言,可能有些棘手的事情是使用SimpleDateFormat規范日期/時間格式。 SimpleDateFormat的基于類級別的Javadoc的文檔非常詳盡,涵蓋了表示日期/時間的各個組成部…

mysql中預定義常量_PHP預定義常量

這些常量在 PHP 的內核中定義。它包含 PHP、Zend 引擎和 SAPI 模塊。PHP_VERSION (string)PHP_OS (string)PHP_EOL (string)自 PHP 4.3.10 和 PHP 5.0.2 起可用PHP_INT_MAX (integer)自 PHP 4.4.0 和 PHP 5.0.5 起可用PHP_INT_SIZE (integer)自 PHP 4.4.0 和 PHP 5.0.5 起可用D…

iOS與H5交互

前提:在iOS控制器中加載UIWebView,設置代理,遵守UIWebViewDelegate協議。 一、iOS調用JS方法 通過iOS調用JS代碼實現起來比較方便直接調用UIWebView的方法- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script…

cocos2dx 3.x 蒙板 遮罩 點擊圓功能

//注冊觸摸EventListenerTouchOneByOne *listener EventListenerTouchOneByOne::create();listener->onTouchBegan CC_CALLBACK_2(HelloWorld::onTouchBegan,this);listener->onTouchMoved CC_CALLBACK_2(HelloWorld::onTouchMoved,this);listener->onTouchEnded …

markdownTest

MARKDOWNTEST 11111111111111有一種神奇的語言,它比html還簡單,它巧妙地將內容與格式整合在一起——它就是Markdown有一種神奇的語言,它比html還簡單,它巧妙地將內容與格式整合在一起——它就是Markdown 111111111111111222222222…

python模擬密碼有效性檢測功能_檢查密碼有效性(Django/Python)

我有一個非常小的Django應用程序,主要是為了學習。我使用的是Django提供的內置用戶模型。為了學習這個功能,我創建了一些頁面,這些頁面允許我創建和編輯用戶,而不必進入管理面板。在register頁面允許我非常容易地檢查密碼和電子郵…

教程:Hibernate,JPA –第1部分

這是關于使用Hibernate和JPA的教程的第一部分。 這部分是對JPA和Hibernate的介紹。 第二部分將研究使用Spring ORM組合Spring MVC應用程序以減少創建CRUD應用程序所需的代碼量。 為此,您需要熟悉Maven,JUnit,SQL和關系數據庫。 依存關系 首…

TCP、UDP套接字的數據傳輸

tcp發送數據&#xff1a; 1 #include <sys/types.h> 2 #include <socket.h> 3 ssize_t send(int sockfd,const void *msg,size_t len,int flags); 函數send只能對面向連接的套接字使用。參數sockfd為已經建立好連接的套接字描述符。參數msg指向待發送數據的緩沖區&…

Windows下用PIP安裝scipy出現no lapack/blas resources found

Windows下升級了pandas&#xff0c;但是發現scipy包隨后引用出錯&#xff0c;后來確認需重新安裝scipy&#xff0c; 在用PIP安裝scipy出現no lapack/blas resources found的錯誤&#xff0c;具體原因可參考 這里。 后來找到一種簡便的解決方案&#xff0c;只要在網站 Unofficia…

Aleri –復雜事件處理

Sybase的Aleri流媒體平臺是CEP市場中最受歡迎的產品之一。 它在Sybase的交易平臺RAP版本中使用&#xff0c;該版本在資本市場中廣泛用于管理投資組合中的頭寸。 今天&#xff0c;在這個由多個部分組成的系列文章的第一個部分中&#xff0c;我希望提供Aleri平臺的概述&#xff0…

python版本回退_Python爬蟲之BeautifulSoup解析之路

上一篇分享了正則表達式的使用&#xff0c;相信大家對正則也已經有了一定的了解。它可以針對任意字符串做任何的匹配并提取所需信息。但是我們爬蟲基本上解析的都是html或者xml結構的內容&#xff0c;而非任意字符串。正則表達式雖然很強大靈活&#xff0c;但是對于html這樣結構…

0615 團隊第二階段貢獻

0615 團隊第二階段貢獻 列志華http://www.cnblogs.com/liezhihua/ 26% 組長 黃柏堂 http://www.cnblogs.com/huang123/ 22% 團隊 韓麒麟 http://www.cnblogs.com/hanqilin/ 26% 團隊 王俊杰 http://www.cnblogs.com/wangjunjie123/ 28%團隊posted on 2016…

WebStorm 運行Rect Native 項目

今天教大家如何直接使用WebStorm這個IDE直接完成編碼運行項目工作.這樣就可以不用打開Xcode了. 1.首先點擊WebStorm右上方的下拉箭頭彈出的Edit Configurations.... 2.然后會進入一個配置頁面.點擊左上方的.在彈出的列表中選中npm.如圖. 3.在右邊的配置框中,先選擇Command為hel…

python編程比賽_用Python編程分析4W場球賽后,2018世界杯冠軍竟是…

比賽已經開始&#xff0c;我們不妨用 Python 來對參賽隊伍的實力情況進行分析&#xff0c;并大膽的預測下本屆世界杯的奪冠熱門球隊吧&#xff01;通過數據分析&#xff0c;可以發現很多有趣的結果&#xff0c;比如&#xff1a;找出哪些隊伍是首次進入世界杯的黑馬隊伍找出2018…

GlassFish 3.1.2充滿了MOXy(EclipseLink JAXB)

我非常高興地宣布&#xff0c; EclipseLink JAXB&#xff08;MOXy&#xff09;現在是GlassFish 3.1.2中的JAXB&#xff08; JSR-222 &#xff09;提供程序。 我要感謝EclipseLink和GlassFish提交者為實現這一目標付出的??辛勤工作。 在本文中&#xff0c;我將介紹如何利用MOX…

夢斷代碼閱讀筆記03

讀完《夢斷代碼(Dream In Code)》樣書&#xff0c;我感覺心情有點沉重&#xff0c;Chandler項目的結局&#xff0c;它失敗了&#xff0c;它成了眾多失敗軟件項目中的一個。這個結局讓那個我感受到軟件實在是太難了&#xff0c;我覺得當初選這個專業可能到最后只是一個碼農。但是…

Java訪問權限的范圍

二、下面用表格來展示四種修飾符的訪問權限范圍&#xff1a; 同一個類 同一個包 不同包的子類 不同包的非子類 public √ √ √ √ protected √ √ √ 默認(default) √ √ private √ 轉載于:https://www.cnblogs.com/jianxin-lilang/p/6…

JavaFX 2 GameTutorial第2部分

介紹 ?他的是一系列與一個JavaFX 2游戲教程博客條目的第二批。 如果您尚未閱讀第1部分&#xff0c;請參閱JavaFX 2游戲教程的簡介部分。 在第1部分中&#xff0c;我提到了游戲的某些方面以及原型飛船的簡單演示&#xff08;原型由簡單的形狀組成&#xff09;&#xff0c;該飛船…

sqlyog連接mysql教程_如何用SQLyog實現遠程連接MySQL

SQLyog客戶端&#xff0c;用root用戶遠程鏈接MySQL時&#xff0c;提示ldquo;訪問被拒絕rdquo;&#xff0c;在網上搜索了一下原因。原來是MySQL沒有授權其遠程鏈1&#xff0c;SQLyog客戶端&#xff0c;&#xff0c;用root用戶遠程鏈接MySQL時&#xff0c;提示“訪問被拒絕”&…

動態SQL+變量綁定:解決ORA-01704: 字符串文字太長的問題

最近在做一個ESB項目&#xff0c;有一個trigger里面執行動態SQL的時候報錯&#xff1a; ORA-01704: 字符串文字太長 經檢查發現SQL里面有個字段是clob類型&#xff0c;內容長度4009&#xff0c;在oracle里面&#xff0c; 一對引號內的字符長度如果超過4000&#xff0c;就會報OR…