精通Quartz-入門-Job

JobDetail實例,并且,它通過job的類代碼引用這個job來執行。每次調度器執行job時,它會在調用job的execute(..)方法之前創建一個他的實例。這就帶來了兩個事實:一、job必須有一個不帶參數的構造器,二、在job類里定義數據成員并沒有意義,因為在每次job執行的時候他們的值會被覆蓋掉。

你可能現在想要問“我怎樣給一個job實例提供屬性/配置?”和“在幾次執行間我怎樣能跟蹤job的狀態?”這些問題的答案是一樣的:用JobDataMap- JobDetail對象的一部分。

JobDataMap

JobDataMap能夠支持任何序列化的對象,當job執行時,這些對象能夠在job實例中可用。JobDataMap實現了Java Map接口,它有一些附加的方法,這些方法用來儲存和跟蹤簡單類型的數據。

如下代碼可以很快地給job增加JobDataMap:

jobDetail.getJobDataMap().put("jobSays", "Hello World!");

jobDetail.getJobDataMap().put("myFloatValue", 3.141f);

jobDetail.getJobDataMap().put("myStateData", new ArrayList());

在job執行時,我們可以在job里通過如下代碼得到JobDataMap:

public class DumbJob implements Job {

public DumbJob() {

}

public void execute(JobExecutionContext context)

throws JobExecutionException

{

String instName = context.getJobDetail().getName();

String instGroup = context.getJobDetail().getGroup();

JobDataMap dataMap = context.getJobDetail().getJobDataMap();

String jobSays = dataMap.getString("jobSays");

float myFloatValue = dataMap.getFloat("myFloatValue");

ArrayList state = (ArrayList)dataMap.get("myStateData");

state.add(new Date());

System.err.println("Instance " + instName + " of DumbJob says: " + jobSays);

}

}

如果用一個持久JobStore(在指南JobStore章節討論),我們就應該注意在JobDataMap里放些什么,因為在它里面的對象將會被序列化,并且這些對象會因此產生一些class-versioning問題。明顯的,標準Java類型應該是很安全的,但是,任何時候某人改變了一個你已經序列化的實例的類的定義時,我們就要注意不能夠破壞兼容性了。在這個方面的進一步信息可以在Java Developer Connection Tech Tip: Serialization In The Real World里找到。我們能把JDBC-JobStore和JobDataMap放到一個模式里,在那里,只有簡單類型和String型能被儲存在Map里,從而消去任何以后的序列化問題。

Stateful vs. Non-Stateful Jobs

觸發器也有與它們關聯的JobDataMaps。假設我們有一個儲存在調度器里被多個觸發器關聯的job,然而,對于每個獨立的觸發器,我想提供給job不同的數據輸入,在這個時候,JobDataMaps就很有用了。

在job執行期間,JobDataMaps能夠在JobExecutionContext里獲得。JobDataMap融合在Trigger和JobDetail類里,JobDataMap里面的值能夠利用key來更新。

以下例子顯示,在job執行期間從JobExecutionContext里的JobDataMap得到數據:

public class DumbJob implements Job {

public DumbJob() {

}

public void execute(JobExecutionContext context)

throws JobExecutionException

{

String instName = context.getJobDetail().getName();

String instGroup = context.getJobDetail().getGroup();

JobDataMap dataMap = context.getJobDataMap(); // 注意:不同于以前的例子

String jobSays = dataMap.getString("jobSays");

float myFloatValue = dataMap.getFloat("myFloatValue");

ArrayList state = (ArrayList)dataMap.get("myStateData");

state.add(new Date());

System.err.println("Instance " + instName + " of DumbJob says: " + jobSays);

}

}

StatefulJob

現在,關于job狀態數據的一些附加要點:一個job實例能定義為"有狀態的"或者"無狀態的"。無狀態的jobs僅當它們在被加入到調度器里時才存儲JobDataMap。這就意味著,在jobs執行期間對JobDataMap里數據的任何改變都會丟失,下次執行時job將看不到這些數據。你可能會猜到,一個有狀態的job就是它的反面例子-它的JobDataMap是在每次執行完job后再次儲存的。一個缺點就是有狀態的job不能夠并發執行。換句話說,如果job是有狀態的,一個觸發器嘗試觸發這個已經執行了的job時,這個觸發器就會等待直到這次執行結束。

用實現

StatefulJob
接口來標記一個job是有狀態的。

Job 'Instances'

我們能夠創建一個單獨的job類,并且通過創建多個JobDetails實例在調度器里儲存很多它的“實例定義”,每個都有它自己的屬性集和JobDataMap ,把它們都加入到調度器里。

當一個觸發器觸發時,與它關聯的job就是通過配置在調度器上的JobFactory 來實例化的。默認的JobFactory 簡單的調用在job類上的newInstance()方法,你可能想要創建自己的JobFactory實現來完成一些自己想要的事情,如:擁有應用程序的IoC或者DI容器進程/初始化job實例。

job的其他屬性

這兒有一個其他屬性的總結,這些屬性是通過JobDetail對象為一個job實例定義的。

  • 持久性– 如果一個job是非持久的,一旦沒有任何可用的觸發器與它關聯時,他就會自動得從調度器里被刪除。
  • 不穩定性-如果一個job是不穩定的,他就不會在重起Quartz調度器之間持久化。
  • 請求恢復– 如果一個job“請求恢復”,在調度器“硬關閉”(如:該進程崩潰,機器被關掉)時這個job還在執行,過后,當調度器再次啟動時,他就會再次執行。在這種情況下,JobExecutionContext.isRecovering() 方法將會返回true.
  • Job監聽器 –一個job能夠有0個或者多個與它關聯的監聽器。當job執行時,監聽器就會被通知。在監聽器的更多討論請看TriggerListeners & JobListeners

JobExecutionException

最后,我們來看看Job.execute(..)方法的一些細節。你能夠從execute方法里拋出的僅有的異常類型就是JobExecutionException。因為這樣,我們應該使用try-catch塊包圍整個execute方法內容。我們還應該花一些時間看看JobExecutionException文檔。當job執行發生異常時,通過設置JobExecutionException,可以讓此job再次進入調度器或者今后不再運行。


轉載于:https://juejin.im/post/5c08db7ff265da613d7bde81

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

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

相關文章

單據打印_Excel多功能進銷存套表,自動庫存單據,查詢打印一鍵操作

Hello大家好,我是幫幫。今天跟大家分享一張Excel多功能進銷存管理套表,自動庫存,單據打印,查詢統算一鍵操作。為了讓大家能更穩定的下載模板,我們又開通了全新下載方式(見文章末尾),以便大家可以輕松獲得免…

卡爾曼濾波濾波方程_了解卡爾曼濾波器及其方程

卡爾曼濾波濾波方程Before getting into what a Kalman filter is or what it does, let’s first do an exercise. Open the google maps application on your phone and check your device’s current location.在了解什么是卡爾曼濾波器或其功能之前,我們先做一個…

js中的new()到底做了些什么??

要創建 Person 的新實例,必須使用 new 操作符。以這種方式調用構造函數實際上會經歷以下 4個步驟:(1) 創建一個新對象;(2) 將構造函數的作用域賦給新對象(因此 this 就指向了這個新對象) ;(3) 執行構造函數…

Candidate sampling:NCE loss和negative sample

在工作中用到了類似于negative sample的方法,才發現我其實并不了解candidate sampling。于是看了一些相關資料,在此簡單總結一些相關內容。 主要內容來自tensorflow的candidate_sampling和卡耐基梅隆大學一個學生寫的一份notesNotes on Noise Contrastiv…

golang key map 所有_Map的底層實現 為什么遍歷Map總是亂序的

Golang中Map的底層結構其實提到Map,一般想到的底層實現就是哈希表,哈希表的結構主要是Hashcode 數組。存儲kv時,首先將k通過hashcode后對數組長度取余,決定需要放入的數組的index當數組對應的index已有元素時,此時產生…

樸素貝葉斯分類器 文本分類_構建災難響應的文本分類器

樸素貝葉斯分類器 文本分類背景 (Background) Following a disaster, typically you will get millions and millions of communications, either direct or via social media, right at the time when disaster response organizations have the least capacity to filter and…

第二輪沖次會議第六次

今天早上八點我們進行了站立會議 此次站立會議我們開了30分鐘 參加會議的人員: 黃睿麒 侯熙磊 會議內容:我們今天討論了如何分離界面,是在顯示上進行限制從而達到不同引用展現不同便簽信息,還是單獨開一個界面從而實現顯示不同界面…

markdown 鏈接跳轉到標題_我是如何使用 Vim 高效率寫 Markdown 的

本文僅適合于對vim有一定了解的人閱讀,沒有了解的人可以看看文中的視頻我使用 neovim 代替 vim ,有些插件是 neovim 獨占, neovim 和 vim 的區別請自行 google系統: Manjaro(Linux)前言之前我一直使用的是 vscode 和 typora 作為 markdown 編…

nginx運用

1、nginx的 命令 start nginx 這樣,nginx 服務就啟動了。打開任務管理器,查看 nginx.exe 進程,有二個進程會顯示,占用系統資源,那是相當的少。然后再打開瀏覽器,輸入 http://127.0.0.1/ 就可以看到nginx的…

數據修復案例

/*--數據修復案例 如何在數據庫文件損壞(日志文件完好)情況下,進行恢復 --(收藏整理)--*/ --測試步驟 --1.建一個測試數據庫test create database test go use test go -…

Seaborn:Python

Seaborn is a data visualization library built on top of matplotlib and closely integrated with pandas data structures in Python. Visualization is the central part of Seaborn which helps in exploration and understanding of data.Seaborn是建立在matplotlib之上…

利用日志還原數據庫

USE masterGO-- 創建測試數據庫CREATE DATABASE db_test GO -- 對數據庫進行備份BACKUP DATABASE db_testTO DISK c:/db_test.bakWITH FORMATGO -- 創建測試表CREATE TABLE db_test.dbo.tb_test( ID int) -- 延時 1 秒鐘,再進行后面的操作(這是由于SQL Server的時間精度…

Springboot集成BeanValidation擴展一:錯誤提示信息加公共模板

Bean Validator擴展 1、需求 ? 在使用validator時,有個需求就是公用錯誤提示信息,什么意思? 舉個例子: ? NotEmpty非空判斷,在資源文件中我不想每個非空判斷都寫”不能為空“,只需要寫”###“&#xff0c…

福大軟工 · 第十次作業 - 項目測評(團隊)

寫在前面 本次作業測試報告鏈接林燊大哥第一部分 調研,評測 一、評測 軟件的bug,功能評測,黑箱測試 1.下載并使用,描述最簡單直觀的個人第一次上手體驗 IOS端 UI界面簡單明了,是我喜歡的極簡風格。課程模塊界面簡潔優雅…

銷貨清單數據_2020年8月數據科學閱讀清單

銷貨清單數據Note: I am not affiliated with any of the writers in this article. These are simply books and essays that I’m excited to share with you. There are no referrals or a cent going in my pocket from the authors or publishers mentioned. Reading is a…

c++運行不出結果_fastjson 不出網利用總結

點擊藍字 關注我們 聲明 本文作者:flashine 本文字數:2382 閱讀時長:20分鐘 附件/鏈接:點擊查看原文下載 聲明:請勿用作違法用途,否則后果自負 本文屬于WgpSec原創獎勵計劃,未經許可禁止轉載 前言 之前做項目在內網測到了一個fastjson反序列化漏洞,使用dnslo…

FocusBI:租房分析可視化(PowerBI網址體驗)

微信公眾號:FocusBI關注可了解更多的商業智能、數據倉庫、數據庫開發、爬蟲知識及滬深股市數據推送。問題或建議,請關注公眾號發送消息留言;如果你覺得FocusBI對你有幫助,歡迎轉發朋友圈或在文章末尾點贊[1] 《商業智能教程》pdf下載地址 …

米其林餐廳 鹽之花_在世界范圍內探索《米其林指南》

米其林餐廳 鹽之花Among the culinary world, there are few greater accolades for a restaurant than being awarded a Michelin star (or three!), or being listed as one of the best in the world by a reputable guide. Foodies and fine dine lovers like myself, see …

require_once的用法

require_once 語句和 require 語句完全相同,唯一區別是 PHP 會檢查該文件是否已經被包含過,如果是則不會再次包含。 參見 include_once 的文檔來理解 _once 的含義,并理解與沒有 _once 時候有什么不同。 有一個文件a.php,里面有一個變量$var1…

差值平方和匹配_純前端實現圖片的模板匹配

基礎介紹模板匹配是指在當前圖像A里尋找與圖像B最相似的部分,本文中將圖像A稱為模板圖像,將圖像B稱為搜索匹配圖像。引言:一般在Opencv里實現此種功能非常方便:直接調用result cv2.matchTemplate(templ, search, method)templ 為…