【Quartz】插件的使用

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

? Quartz 框架提供了幾種用于擴展平臺能力的方式。通過使用各種 "鉤子" (通常指的就是擴展點),Quartz 變得很容易被擴展和定制化來適應你的需要。其中一個最簡單的擴展框架的方法就是使用 Quartz 插件。本章就來看看如何使用插件機制讓 Quartz 進入到之前 Quartz 用戶沒去過的領域。

?

一、使用Quartz自帶插件范例

?? 下面將使用插件實現從XML得到JOB,不用手工的把job和trigger加到Scheduler中去再來運行,這樣就很方便。如果要更改任務,直接在xml中配置就可以了。不用再寫java代碼。

1、首先是job類:

import java.util.Date;
import java.util.Set;import org.quartz.DisallowConcurrentExecution;
import org.quartz.InterruptableJob;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.PersistJobDataAfterExecution;
import org.quartz.UnableToInterruptJobException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class SimpleJob implements Job {private static Logger log = LoggerFactory.getLogger(SimpleJob.class);private JobKey jobkey=null;@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {jobkey = context.getJobDetail().getKey();log.info("Excuting job: " + jobkey + " executing at " + new Date()+" fire by: "+context.getTrigger().getKey());if(context.getMergedJobDataMap().size()>0){Set<String>  keys=	context.getMergedJobDataMap().keySet();for (String key : keys) {String value= context.getMergedJobDataMap().getString(key);log.info(" jobdatamap entry: "+key+" = "+value);}context.setResult("hello");}}}


2、job觸發時間配置,使用quartz_data.xml

<?xml version="1.0" encoding="UTF-8"?>
<job-scheduling-data xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"version="1.8"><pre-processing-commands><delete-jobs-in-group>*</delete-jobs-in-group>  <!-- clear all jobs in scheduler --><delete-triggers-in-group>*</delete-triggers-in-group> <!-- clear all triggers in scheduler --></pre-processing-commands><processing-directives><!-- if there are any jobs/trigger in scheduler of same name (as in this file), overwrite them --><overwrite-existing-data>true</overwrite-existing-data><!-- if there are any jobs/trigger in scheduler of same name (as in this file), and over-write is false, ignore them rather then generating an error --><ignore-duplicates>false</ignore-duplicates> </processing-directives><schedule><job><name>TestJob1</name><job-class>com.mucfc.SimpleJob</job-class></job><job><name>TestDurableJob</name><job-class>com.mucfc.SimpleJob</job-class><durability>true</durability><recover>false</recover></job><trigger><simple><name>TestSimpleTrigger1AtFiveSecondInterval</name><job-name>TestJob1</job-name><repeat-count>-1</repeat-count> <!-- repeat indefinitely  --><repeat-interval>5000</repeat-interval>  <!--  every 5 seconds --></simple></trigger><job><name>TestJob2</name><group>GroupOfTestJob2</group><description>This is the description of TestJob2</description><job-class>com.mucfc.SimpleJob</job-class><durability>false</durability><recover>true</recover><job-data-map><entry><key>someKey</key><value>someValue</value></entry><entry><key>someOtherKey</key><value>someOtherValue</value></entry></job-data-map></job><trigger><simple><name>TestSimpleTrigger2AtTenSecondIntervalAndFiveRepeats</name><group>GroupOfTestJob2Triggers</group><job-name>TestJob2</job-name><job-group>GroupOfTestJob2</job-group><start-time>2010-02-09T10:15:00</start-time><misfire-instruction>MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT</misfire-instruction><repeat-count>5</repeat-count><repeat-interval>10000</repeat-interval></simple></trigger><trigger><cron><name>TestCronTrigger2AtEveryMinute</name><group>GroupOfTestJob2Triggers</group><job-name>TestJob2</job-name><job-group>GroupOfTestJob2</job-group><job-data-map><entry><key>someKey</key><value>overriddenValue</value></entry><entry><key>someOtherKey</key><value>someOtherOverriddenValue</value></entry></job-data-map><cron-expression>0 * * ? * *</cron-expression></cron></trigger><trigger><cron><name>TestCronTrigger2AtEveryMinuteOnThe45thSecond</name><group>GroupOfTestJob2Triggers</group><job-name>TestJob2</job-name><job-group>GroupOfTestJob2</job-group><start-time>2015-05-12T12:26:00.0</start-time><end-time>2015-05-16T12:26:00.0</end-time><misfire-instruction>MISFIRE_INSTRUCTION_SMART_POLICY</misfire-instruction><cron-expression>45 * * ? * *</cron-expression><time-zone>America/Los_Angeles</time-zone></cron></trigger></schedule>    
</job-scheduling-data>


3、配置文件


#============================================================================
# Configure Main Scheduler Properties  
#============================================================================org.quartz.scheduler.instanceName: TestScheduler
org.quartz.scheduler.instanceId: AUTOorg.quartz.scheduler.skipUpdateCheck: true#============================================================================
# Configure ThreadPool  
#============================================================================org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 3
org.quartz.threadPool.threadPriority: 5#============================================================================
# Configure JobStore  
#============================================================================org.quartz.jobStore.misfireThreshold: 60000org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore#org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#org.quartz.jobStore.useProperties: false
#org.quartz.jobStore.dataSource: myDS
#org.quartz.jobStore.tablePrefix: QRTZ_
#org.quartz.jobStore.isClustered: false#============================================================================
# Configure Datasources  
#============================================================================#org.quartz.dataSource.myDS.driver: org.postgresql.Driver
#org.quartz.dataSource.myDS.URL: jdbc:postgresql://localhost/dev
#org.quartz.dataSource.myDS.user: jhouse
#org.quartz.dataSource.myDS.password: 
#org.quartz.dataSource.myDS.maxConnections: 5#============================================================================
# Configure Plugins 
#============================================================================org.quartz.plugin.triggHistory.class: org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class: org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames: quartz_data.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound: true
org.quartz.plugin.jobInitializer.scanInterval: 120
org.quartz.plugin.jobInitializer.wrapInUserTransaction: false

其中org.quartz.plugin.jobInitializer.class: org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin會自動加載quartz_data.xml中的trigger和job到Scheduler

3、測試

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Matcher;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar;
import org.quartz.impl.matchers.KeyMatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class PluginExample {public static void run() throws Exception {Logger log = LoggerFactory.getLogger(PluginExample.class);SchedulerFactory sf = new StdSchedulerFactory();Scheduler sche = sf.getScheduler();sche.start();try {Thread.sleep(300000L);} catch (Exception e) {}sche.shutdown();SchedulerMetaData metaData = sche.getMetaData();log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");}public static void main(String[] args) {PluginExample simpleExample = new PluginExample();try {simpleExample.run();} catch (Exception e) {e.printStackTrace();}}
}


4、結果:

?

看,不用再把job和trigger手工加到Scheduler中去,它會自動加載XML中定義好的任務,需要做的只是start就行了。

?

?

轉自:?http://blog.csdn.net/evankaka

?Quartz存儲與持久化-基于quartz.properties的配置 見原博主另一文:https://blog.csdn.net/Evankaka/article/details/45556207

?

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

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

相關文章

自動化運維平臺(前端vue)

前端的大體流程&#xff1a;首先是Login登錄組件&#xff0c;當輸入用戶名和密碼之后&#xff0c;發送post請求到后端&#xff0c;然后根據返回的數據的是否正常&#xff0c;如果正常&#xff0c;將返回的token以及用戶名保存到sessionStorage中&#xff0c;并使用導航守衛進行…

老程序員的下場

長期從事編程活動的程序員都期望在50多歲時能爬到一個足夠高的職位&#xff0c;或者能順利的退休。 但我在這里討論的可能是一個你還沒有想過的問題&#xff1a;如果到那時你失業了呢&#xff1f; 50多歲時你的職業仕途會成為一個問題。如果你有很好的技術&#xff0c;有人雇…

Quartz 之入門示例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 環境:XPMyeclipse6.5JDK1.6 quartz官網:http://www.quartz-scheduler.org/ 參考資料 1 Quartz任務調度快速入門 http://www.blogjava…

CSS3最顛覆性的動畫效果,基本屬性[3D]

和2D一樣也是transform 即變形 1)rotateX rotateY rotateZ&#xff08;也可以用transform-origin來設置旋轉中心點&#xff09; 2)透視(perspective) 給父親加透視&#xff0c;透視就是模擬眼睛到物體的距離&#xff0c;近大遠小&#xff0c;即數值越小&#xff0c;3D越明顯 理…

解決報錯 :A component required a bean of type ‘gentle.test.Show‘ that could not be found

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 啟動工程失敗&#xff0c;報錯如題&#xff1a; A component required a bean of type gentle.test.Show that could not be found.…

30天提升技術人的寫作力-第十七天

約束作者在漫長的創作過程中&#xff0c;不偏離寫作目標。當寫的字數在十幾萬以上時&#xff0c;沒有先規劃&#xff0c;就會陷入混亂&#xff0c;發生注入重復、疏漏、相關知識未講解等問題。制作長文章或書籍的大綱&#xff0c;需要使用發散收斂工具。所謂發散是多方向、多思…

白領必看的十種職場致命毒藥

找到一個合適的工作可能需要3到15個月不等的時間——然而丟掉飯碗只需要幾天或幾周。下面是10種職場毒藥的特點&#xff1a;       1、人際交往技能不佳       討人喜歡會大有幫助。研究均表明和那些能力強而呆板的人相比&#xff0c;人們一致而且不可遏制地更喜歡和…

eclipse中folder、source folder和package的區別

今天做ssm項目時&#xff0c;突然發現了這個問題&#xff0c;特別好奇&#xff0c;sqlSessionFactory.xml文件如何找到&#xff1a; 1、放在src/hello目錄下&#xff1a; InputStream inputStream Resources.getResourceAsStream("./hello/sqlMapperConfig.xml"); 2…

解決.quartz.ObjectAlreadyExistsException: Unable to store Job : ‘jyGroup.jyJob‘, because one already

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 報錯如題&#xff1a; 定時任務出現異常 &#xff1a; org.quartz.ObjectAlreadyExistsException: Unable to store Job : jyGroup.…

WeMos-D1R2的使用

2019獨角獸企業重金招聘Python工程師標準>>> WeMos介紹 WeMos-D1R2一個基于ESP8266-12 Wifi模塊的Arduino-UNO開發板。也就是說&#xff0c;WeMos-D1R2是一個具有wifi功能的Arduino開發板&#xff0c;但WeMos-D1R2與Arduino-UNO的引腳不是一一對應的&#xff0c;其對…

職場中什么樣的員工最易發展?

職場中什么樣的員工最“搶手”?也許你會說有能力的人&#xff0c;沒錯有能力的人競爭力一定很強&#xff0c;但是能力會隨著經驗的豐富而慢慢變強&#xff0c;所以它不足以某個人在職場中站穩腳主要原因&#xff0c;反而是一個人的工作態度決定著他在職場中的發展方向與前景。…

PAT 1048 數字加密

題目鏈接 一開始我還以為以b的長度為基準&#xff0c;因為b是要加密的數據啊&#xff0c;看了答案才知道原來要以最長的長度為基準。但是這道題還有個bug&#xff0c;就是當你算出的結果前面有0竟然也可以通過&#xff0c;比如a為1111&#xff0c;b為1111&#xff0c;答案是020…

RabbitMQ MQTT協議和AMQP協議

RabbitMQ MQTT協議和AMQP協議 1 序言... 1 1.1 RabbitMq結構... 1 1.2 RabbitMq消息接收... 4 1.3 Exchange種類和消息發送模式... 4 1.4 RabbitMq的協議... 6 1.4.1 AMQP協議... 6 1.4.2 MQTT協議... 8 2 RabbitMq服務器安裝和使用…

Quartz 定時任務(Scheduler)的 3 種實現方式

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 PS&#xff1a;第 3 種最簡單。 一、引入 jar 。 <!-- quartz 定時任務調度 --><dependency><groupId>org.springfr…

加速財務自由的7種理財方法

有人說財務自由是個遙不可及的路&#xff0c;有人卻覺得想要在財務上成功很簡單&#xff0c;到底財務自由有沒有一個正確的方法或是被證明的技巧可以被實現&#xff1f;如果你現在還沒達成或是正在達成&#xff0c;底下這7種簡單有效的行動與方法可以加速你建構財務自由之路。 …

Code Chef December Challenge 2018題解

傳送門 \(MAXEP\) 二分&#xff0c;不過二分的時候要注意把\(mid\)設成\(\left\lfloor{9lr\over 10}\right\rfloor\)&#xff0c;這樣往右的次數不會超過\(6\)次 //minamoto #include<bits/stdc.h> #define R register #define inline __inline__ __attribute__((always_…

Git 安裝及 idea 配置 Git

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.git官網下載地址&#xff1a;點此跳轉git官網 git具體安裝不做詳細敘述。 2.打開idea 點擊Configure -> Settings 3.選擇Git 找到…

創業成功需早起?看看IT大佬們的作息時間

有人說&#xff0c;在一個企業里&#xff0c;級別的高低與越起越早現象呈坐標曲線型&#xff0c;也就是說&#xff0c;一開始進職場都嗜睡&#xff0c;有了一定級別就開始早起&#xff0c;隨著級別的升高&#xff0c;起床的時間也越來越早&#xff0c;到了級別特高了&#xff0…

第六章學習小結

本章學習了圖的結構及應用&#xff0c; 首先是圖的分類&#xff0c;圖分為無向圖、有向圖、完全圖、連通圖、強連通圖、帶權圖、稀疏圖、稠密圖等等。 圖的存儲方式有兩大類&#xff0c;以邊集合方式的表示法和以鏈接方式的表示法。其中&#xff0c;以邊集合方式表示的為鄰接矩…

大數據薪資一再飆升 學習大數據需要哪些基礎?

2018年6月19日&#xff0c;備受關注的個人所得稅法修正案草案迎來第七次大修&#xff0c;個稅起征點由每月3500元提高至每月5000元(每年6萬元)。對于大多數人來說這絕對是個好消息&#xff0c;但人們更愿意參加培訓班實現高薪。近年來&#xff0c;隨著互聯網的飛速發展以及企業…