【Quartz】Quartz概述及入門實例

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

? Quartz 在開源任務調度框架中的翹首,它提供了強大任務調度機制,難能可貴的是它同時保持了使用的簡單性。Quartz 允許開發人員靈活地定義觸發器的調度時間表,并可以對觸發器和任務進行關聯映射。
??????? 此外,Quartz提供了調度運行環境的持久化機制,可以保存并恢復調度現場,即使系統因故障關閉,任務調度現場數據并不會丟失。此外,Quartz還提供了組件式的偵聽器、各種插件、線程池等功能。

一、Quartz功能概述

Quartz是一個開源的任務調度系統,它能用來調度很多任務的執行。

運行環境

  • Quartz 能嵌入在其他應用程序里運行。
  • Quartz 能在一個應用服務器里被實例化(或servlet容器), 并且參與XA事務
  • Quartz能獨立運行(通過JVM),或者通過RMI
  • Quartz能被集群實例化

任務調度

當一個指定給任務的觸發器發生時,任務就被調度執行.觸發器能被創建為:

  • 一天的某個時間(精確到毫秒級)
  • 一周的某些天
  • 一個月的某些天
  • 一年的某些天
  • 不在一個Calendar列出的某些天 (例如工作節假日)
  • 在一個指定的次數重復
  • 重復到一個指定的時間/日期
  • 無限重復
  • 在一個間隔內重復

能夠給任務指定名稱和組名.觸發器也能夠指定名稱和組名,這樣可以很好的在調度器里組織起來.一個加入到調度器里的任務可以被多個觸發器注冊。在J2EE環境里,任務能作為一個分布式(XA)事務的一部分來執行。

任務執行

  • 任務能夠是任何實現Job接口的Java類。
  • 任務類能夠被Quartz實例化,或者被你的應用框架。
  • 當一個觸發器觸發時,調度器會通知實例化了JobListener 和TriggerListener 接口的0個或者多個Java對象(監聽器可以是簡單的Java對象, EJBs, 或JMS發布者等). 在任務執行后,這些監聽器也會被通知。
  • 當任務完成時,他們會返回一個JobCompletionCode ,這個代碼告訴調度器任務執行成功或者失敗.這個代碼 也會指示調度器做一些動作-例如立即再次執行任務。

任務持久化

  • Quartz的設計包含JobStore接口,這個接口能被實現來為任務的存儲提供不同的機制。
  • 應用JDBCJobStore, 所有被配置成“穩定”的任務和觸發器能通過JDBC存儲在關系數據庫里。
  • 應用RAMJobStore, 所有任務和觸發器能被存儲在RAM里因此不必在程序重起之間保存-一個好處就是不必使用數據庫。

事務

  • 使用JobStoreCMT(JDBCJobStore的子類),Quartz 能參與JTA事務。
  • Quartz 能管理JTA事務(開始和提交)在執行任務之間,這樣,任務做的事就可以發生在JTA事務里。

集群

  • Fail-over.
  • Load balancing.

監聽器和插件

  • 通過實現一個或多個監聽接口,應用程序能捕捉調度事件來監控或控制任務/觸發器的行為。
  • 插件機制可以給Quartz增加功能,例如保持任務執行的歷史記錄,或從一個定義好的文件里加載任務和觸發器。
  • Quartz 裝配了很多插件和監聽器。

?

二、Quartz體系結構

?

Quartz對任務調度的領域問題進行了高度的抽象,提出了調度器、任務和觸發器這3個核心的概念,并在org.quartz通過接口和類對重要的這些核心概念進行描述:

●Job

?????? 是一個接口,只有一個方法voidexecute(JobExecutionContext context),開發者實現該接口定義運行任務,JobExecutionContext類提供了調度上下文的各種信息。Job運行時的信息保存在 JobDataMap實例中;

●JobDetail

??????? Quartz在每次執行Job時,都重新創建一個Job實例,所以它不直接接受一個Job的實例,相反它接收一個Job實現 類,以便運行時通過newInstance()的反射機制實例化Job。因此需要通過一個類來描述Job的實現類及其它相關的靜態信息,如Job名字、描 述、關聯監聽器等信息,JobDetail承擔了這一角色。

通過該類的構造函數可以更具體地了解它的功用:JobDetail(java.lang.String name, java.lang.String group,java.lang.Class jobClass),該構造函數要求指定Job的實現類,以及任務在Scheduler中的組名和Job名稱;

●Trigger

?????? 是一個類,描述觸發Job執行的時間觸發規則。主要有SimpleTrigger和CronTrigger這兩個子類。當僅需觸 發一次或者以固定時間間隔周期執行,SimpleTrigger是最適合的選擇;而CronTrigger則可以通過Cron表達式定義出各種復雜時間規 則的調度方案:如每早晨9:00執行,周一、周三、周五下午5:00執行等;

●Calendar

?????? org.quartz.Calendar和java.util.Calendar不同,它是一些日歷特定時間點的集合(可以簡 單地將org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一個日歷時間點,無特殊說明后面的Calendar即指org.quartz.Calendar)。一個Trigger可以和多個Calendar關聯,以便排除或 包含某些時間點。

假設,我們安排每周星期一早上10:00執行任務,但是如果碰到法定的節日,任務則不執行,這時就需要在Trigger觸發機制的基礎上使用 Calendar進行定點排除。針對不同時間段類型,Quartz在org.quartz.impl.calendar包下提供了若干個Calendar 的實現類,如AnnualCalendar、MonthlyCalendar、WeeklyCalendar分別針對每年、每月和每周進行定義;

●Scheduler

??????? 代表一個Quartz的獨立運行容器,Trigger和JobDetail可以注冊到Scheduler中,兩者在 Scheduler中擁有各自的組及名稱,組及名稱是Scheduler查找定位容器中某一對象的依據,Trigger的組及名稱必須唯一,JobDetail的組和名稱也必須唯一(但可以和Trigger的組和名稱相同,因為它們是不同類型的)。Scheduler定義了多個接口方法, 允許外部通過組及名稱訪問和控制容器中Trigger和JobDetail。

??????? Scheduler可以將Trigger綁定到某一JobDetail中,這樣當Trigger觸發時,對應的Job就被執行。一個Job可以對應 多個Trigger,但一個Trigger只能對應一個Job。可以通過SchedulerFactory創建一個Scheduler實例。 Scheduler擁有一個SchedulerContext,它類似于ServletContext,保存著Scheduler上下文信息,Job和 Trigger都可以訪問SchedulerContext內的信息。SchedulerContext內部通過一個Map,以鍵值對的方式維護這些上下文數據,SchedulerContext為保存和獲取數據提供了多個put()和getXxx()的方法。可以通過Scheduler# getContext()獲取對應的SchedulerContext實例;

三、入門實例

本文工程免費下載

新建一個Java project.

導入相應的包

執行業務邏輯的Job

?

 
  1. package com.mucfc;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import org.quartz.Job;
  5. import org.quartz.JobExecutionContext;
  6. import org.quartz.JobExecutionException;
  7. /**
  8. *Quartz事件類
  9. *作者 林炳文(ling20081005@126.com 博客:http://blog.csdn.net/evankaka)
  10. *時間 2015.4.29
  11. */
  12. public class Quartz implements Job{
  13. /**
  14. * 事件類,處理具體的業務
  15. */
  16. @Override
  17. public void execute(JobExecutionContext arg0) throws JobExecutionException {
  18. System.out.println("Hello quzrtz "+
  19. new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ").format(new Date()));
  20. }
  21. }


任務調度

?

?

 
  1. package com.mucfc;
  2. import org.quartz.JobBuilder;
  3. import org.quartz.JobDetail;
  4. import org.quartz.Scheduler;
  5. import org.quartz.SchedulerException;
  6. import org.quartz.SimpleScheduleBuilder;
  7. import org.quartz.Trigger;
  8. import org.quartz.TriggerBuilder;
  9. import org.quartz.impl.StdSchedulerFactory;
  10. /**
  11. *Quartz定時執行事件
  12. *作者 林炳文(ling20081005@126.com 博客:http://blog.csdn.net/evankaka)
  13. *時間 2015.4.29
  14. */
  15. public class QuartzTest {
  16. public static void main(String[] args) {
  17. QuartzTest quartzTest=new QuartzTest();
  18. quartzTest.startSchedule();
  19. }
  20. public void startSchedule() {
  21. try {
  22. // 1、創建一個JobDetail實例,指定Quartz
  23. JobDetail jobDetail = JobBuilder.newJob(Quartz.class)
  24. // 任務執行類
  25. .withIdentity("job1_1", "jGroup1")
  26. // 任務名,任務組
  27. .build();
  28. //2、創建Trigger
  29. SimpleScheduleBuilder builder=SimpleScheduleBuilder.simpleSchedule()
  30. //設置間隔執行時間
  31. .withIntervalInSeconds(5)
  32. //設置執行次數
  33. .repeatForever();
  34. Trigger trigger=TriggerBuilder.newTrigger().withIdentity(
  35. "trigger1_1","tGroup1").startNow().withSchedule(builder).build();
  36. //3、創建Scheduler
  37. Scheduler scheduler=StdSchedulerFactory.getDefaultScheduler();
  38. scheduler.start();
  39. //4、調度執行
  40. scheduler.scheduleJob(jobDetail, trigger);
  41. try {
  42. Thread.sleep(60000);
  43. } catch (InterruptedException e) {
  44. e.printStackTrace();
  45. }
  46. scheduler.shutdown();
  47. } catch (SchedulerException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }

(注意這里,通過靜態import,直接就newJob****。)

?

?

?

輸出結果:

這里要注意,定時事件不是在主線程中執行的,而是會開另外的線程來執行。并且當主線程休眠1分鐘后,會把定時事件給關了,這里即使不會無限執行的事件,也要用shutdown();關閉掉,要不定時事件的線程不會釋放資源!

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

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

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

相關文章

python中del語句

有一種方式可以從列表按照給定的索引而不是值來移除一個元素: 那就是 del 語句。 它不同于會返回一個值的 pop() 方法。 del 語句也可以用來從列表中移除切片或者清空整個python列表(我們之前用過的方式是將一個空列表賦值給指定的切片)。 例如: >>…

偷時間的孩子

從事臨床心理工作已有十三、四年(至一九九五年),真的有很多話想跟父母們敞開心扉的談談。 忙碌的現代社會,讓我窺探到了許許多多的杰出角色,他們偷取家庭時間去換取自己的功成名就,他們的心隨著公司的企劃案四處流浪,孩…

關于openstack 專業博主地址.后續更新

首先官方文檔要放的https://docs.openstack.org/ 關于導入鏡像方面說的很詳細的.https://www.cnblogs.com/liawne/p/9322221.html 每天5分鐘系列,有docker openstack等,而且還出書了.https://www.cnblogs.com/CloudMan6/p/5384923.html 轉載于:https://www.cnblogs.com/lovesKe…

Java第一章java語言的概述

一、java語言的概述: 1.1dos命令 常用的dos命令: dir:列出當前目錄下的文件以及文件夾 md:創建目錄 rd:刪除目錄 cd:進入指定目錄 cd..:退回到上一級目錄 cd\:退回到根目錄 del&…

【Quartz】深入Job、JobDetail、JobDataMap、Trigger

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Quartz API核心接口有: Scheduler – 與scheduler交互的主要API;Job – 你通過scheduler執行任務,你…

Apache Accumulo 1.9.3 發布,高性能 K/V 存儲方案

Apache Accumulo 1.9.3 發布了,Apache Accumulo 是一個可靠的、可伸縮的、高性能的排序分布式的 Key-Value 存儲解決方案,基于單元訪問控制以及可定制的服務器端處理。使用 Google BigTable 設計思路,基于 Apache Hadoop、Zookeeper 和 Thrif…

圖形界面上機作業

1、 制作一個如圖所示的界面(使用FlowLayout布局),不要求實現功能。 2、設計一個用標簽、文本行與按鈕來登錄的界面(用GridLayout布局方式)。如圖所示。 轉載于:https://www.cnblogs.com/quan-2723365710/p/10881691.h…

【Quartz】Spring3.2.9 + Quqrtz2.2.1 實現定時實例

一、工程創建 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1、新建一個工程,導入相應的包Spring3.2.9Quqrtz2.2.1commons-logging 集成起來比較簡單,對線程無需任何理解&a…

第七次發博不知道用什么標題好

一、this關鍵字,想起之前總是搞不懂this.name是where.name,嗯!第二個name就是形參name,所以這句話就是講形參name的值傳給成員變量name private void setName(String name ){ this.namename; } 二、構造方法:1.沒有返回值 2.名稱要與本類名稱相同&#x…

Django框架之Filters(過濾器)、母版的使用

在Django的模板語言中,通過使用 過濾器 來改變變量的顯示。 過濾器的語法: {{ value|filter_name:參數 }} 使用管道符"|"來應用過濾器。 注意事項: 過濾器支持“鏈式”操作。即一個過濾器的輸出作為另一個過濾器的輸入。過濾器可以…

不花錢就補足營養的8妙招

如今,人們越來越注重保健,為了補充營養,一些人不惜花重金買各種名貴保健品食用。其實,人體所需要的很多營養素就在我們身邊,它們既不昂貴,也不稀缺,只需我們信手拈來。 葉酸 每人每日應補充…

PostgreSQL 自定義復合類型(composite type) deform引入的額外開銷

標簽 PostgreSQL , UDT , 自定義類型 背景 PG 允許用戶自定義復合類型,自定義復合類型由多個類型組成,使用時會引入一些deform的開銷。 例子 postgres# create unlogged table t(id int, c1 tp1, c2 int); CREATE TABLE postgres# insert into t sele…

第十二周作業

這個作業屬于那個課程c語言這個作業要求在哪里https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/3236我在這個課程的目標是學習掌握單向鏈表,掌握二級指針的概念,以及指針數組這個作業在哪個具體方面幫助我實現目標前面3道題…

職場上的「小人」教我的事

很多人的小指頭都會帶一個尾戒,不是白金就是黃金,大部份是簡單的一環,沒有太多裝飾,也很少鑲寶石,目的不在于當作飾品,而是保命之用。 也有人不習慣戴尾戒,而是把指甲留得長長的,長到…

【Quartz】插件的使用

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Quartz 框架提供了幾種用于擴展平臺能力的方式。通過使用各種 "鉤子" (通常指的就是擴展點),Quartz 變得很容易被擴…

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

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

老程序員的下場

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

Quartz 之入門示例

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

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

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

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

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