1. 程式人生 > >普元 EOS定時任務實現原理

普元 EOS定時任務實現原理

普元平臺的定時任務能力是通過開源的作業排程框架Quartz實現的。

一、定時任務的基本概念:

  • 排程器:負責管理Quartz應用執行時環境,用於排程定時任務。
  • 定時任務:按照某種時間規則,被排程的任務。

               a、從有無狀態來說,有以下兩種:

                        有狀態任務:每次執行的任務是同一個例項,不能被並行執行;如果該任務的執行時間超過下次觸發的時刻,那麼下次的觸發將不會有作用。比如,一個有狀態任務執行時間是5分鐘,它的間隔時間是3分鐘;如果正在執行的時候,下次觸發時刻到達,則不會被執行。

                        無狀態任務:每次執行任務都是一個新的例項,可以並行執行。

              b、從執行的任務型別來說,有以下三種:

                        SCA服務任務:任務是一個SCA服務。

                        邏輯流任務:任務是一個邏輯流。

                        任意Java方法任務:任務是一個Java方法。

              c、觸發模式(觸發器):用於定義任務排程的時間規則,主要有下面兩種:

                        固定時刻觸發(簡單觸發器):一般用於實現間隔固定的時間執行任務,以及重複多少次,如每 2 小時執行一次,重複執行 5 次。

                        日曆週期觸發(複雜觸發器):使用Unix 'cron-like'表示式來定義時間規則,即利用一個包含 7 個欄位的表示式來表示時間排程方式。例如,"0 15 10 * * ? *" 表示每天的 10:15AM 執行任務。對於涉及到星期和月份的排程比較合適。

             d、錯失觸發:定時任務如果錯過觸發而沒有執行,比如系統停止;系統重啟後,就會針對錯失觸發的定時任務進行處理,一般有兩種錯失觸發策略(EOS_QRTZ_TRIGGERS表的MISFIRE_INSTR欄位):

                       立即重新觸發:預設策略,立即執行一次定時任務,而不管錯過幾次。MISFIRE_INSTR欄位值為1。

                       錯過觸發:下次觸發時間到來,再觸發執行定時任務。MISFIRE_INSTR欄位值為2。

            定時任務配置介面如下:

            

二、定時任務實現的基本原理:

  • 單機模式

                 排程器啟動一個排程執行緒,根據觸發器進行輪詢,如果觸發時刻到達,分配一個執行執行緒,執行定時任務。其中排程器及其狀態、觸發器及其狀態、定時任務及其狀態資訊都會持久化到資料庫中,所以系統停止,不會丟失定時任務;系統重新啟動,會重新定時觸發。

  • 叢集模式

                 定時任務的叢集,有負載均衡和故障切換的能力,可以給排程器帶來高可用性和伸縮性。叢集管理的實現是,叢集上的每一個節點通過共享同一個資料庫來工作的(Quartz通過啟動兩個維護執行緒來維護資料庫狀態實現叢集管理,一個是檢測節點狀態執行緒,一個是恢復任務執行緒),通過資料庫鎖來實現併發控制(如果不是叢集,使用記憶體鎖進行併發控制)。下圖是叢集模式拓撲圖:

           負載均衡是自動完成的,叢集的每個節點會盡快觸發任務。當一個觸發器的觸發時間到達時,第一個節點將會獲得任務,並改變任務狀態,成為執行任務的節點。

          故障切換的發生是在當一個節點正在執行一個或者多個任務失敗的時候。當一個節點失敗了,其他的節點會檢測到並且標識在失敗節點上正在進行的資料庫中的任務。任何被標記為可恢復的任務都會被其他的節點重新執行。沒有標記可恢復的任務只會被釋放出來,將會在下次相關觸發器觸發時執行。

  • 注意:

                如果是叢集模式,則要求每個節點的時鐘一定要一致,否則將發生無法預料的問題。

                根據經驗,建議簡單觸發器的間隔時間不要小於20秒。

相關推薦

EOS定時任務實現原理

普元平臺的定時任務能力是通過開源的作業排程框架Quartz實現的。 一、定時任務的基本概念: 排程器:負責管理Quartz應用執行時環境,用於排程定時任務。定時任務:按照某種時間規則,被排程的任務。               a、從有無狀態來說,有以下兩種:                        

Java 定時任務實現原理詳解

在jdk自帶的庫中,有兩種技術可以實現定時任務。一種是使用Timer,另外一個則是ScheduledThreadPoolExecutor。下面為大家分析一下這兩個技術的底層實現原理以及各自的優缺點。 一、Timer 1. Timer的使用 class MyTask exte

EOS Platform 7.6 Oracle資料庫,定時任務偶爾出現不執行問題

【解答】 問題原因:兩個default應用沒有配置叢集,卻連線了同一個資料庫,而且都開啟了排程器 專案裡使用的解決辦法:將一個default應用的排程器開關關閉,使定時任務只在另一個default應用中執行,修改後定時任務執行正常 關閉排程器的兩步操作:修改的是不需要執行定

批處理+定時任務實現定時休息提醒

man window tom img 實現 高級語言 回聲 ice spa 言:俗話說的好,懶是第一生產力,懶是提高生產效率的必要條件。而現今windows是大部分人的第一生產工具,批處理+定時任務這對黃金搭檔就是提升生產效率的第一工具。大家在生產過程中經常會遇到各種周期性

ScheduledExecutorService--目前最理想的定時任務實現方式

run 工具 string java se oid -- 一次 void sta ScheduledExecutorService它是從Java SE5的java.util.concurrent裏,做為並發工具類被引進的,這是目前最理想的定時任務實現方式。 相比於上兩個方法

.net 定時任務 實現方式

net .com best tail 任務 blank uart 方式 所有 項目需要定時同步 sap 系統的數據,所有考慮定時任務的實現: 1、timer 2、Scheduler 參考 :https://blog.csdn.net/kongwei521/article/

Android長時間定時任務實現

col 啟動 cast 廣播 詳細 ref 定時任務 exce not 在服務的onStartCommand方法裏面使用AlarmManager 定時喚醒發送廣播,在廣播裏面啟動服務   每次執行startService方法啟動服務都會執行onStartCommand

MS SQL Server 定時任務實現自動備份

repl let onclick users get 監控 sqlcmd 沒有 arc SQL Server Express 版本是沒有SQL 代理服務的,從而導致不能使用SQL Server的定時自動備份功能。真心感覺這就是一個坑,雖然Express是學習的版本,但是精簡

Springboot自帶定時任務實現動態配置Cron引數

同學們,我今天分享一下SpringBoot動態配置Cron引數。場景是這樣子的:後臺管理介面對定時任務進行管理,可動態修改執行時間,然後儲存入庫,每次任務執行前從庫裡查詢時間,以達到動態修改Cron引數的效果。好,咱們一起來看看是怎麼回事。 Timer:這是java自帶的java.

spring mvc定時任務實現

1.pom.xml <properties> <quartz-version>2.2.1</quartz-version> </properties> <!-- quartz --> <dependency>

quartz定時任務實現

適用於spring框架 1.在web.xml檔案中引入spring-quartz.xml檔案。 <!-- 讀取spring配置檔案 -->  <context-param>   <param-name>contextConfigLoca

SpringBoot整合quartz動態建立定時任務實現以及踩過的坑

需要了解一下quartz有Job,Scheduler,Trigger等概念,在此就不詳細說明 首先說一下功能需求場景 該提醒可以在頁面上進行配置多個,比如可以配置一個提醒:在每天的12點,傳送郵件給某個人,可以繼續配置另外一個提醒:在每個月的10號,給某個人

spring定時任務實現動態定時任務(啟停,週期修改)

使用方法:             複製下方程式碼,在業務需要處呼叫(定時任務狀態和執行週期被修改後),一定要在專案啟動時後立刻執行一次庫中全資料呼叫此方法,List<Cron> crons   Cron中一定要有業務類的包加類名(com.rails.trave

Quartz使用-入門使用(java定時任務實現)

Quartz是一個大名鼎鼎的Java版開源定時排程器,功能強悍,使用方便。 一、核心概念 Quartz的原理不是很複雜,只要搞明白幾個概念,然後知道如何去啟動和關閉一個排程程式即可。 1、Job 表示一個工作,要執行的具體內容。此介面中只有一個方法 void e

關於quartz定時任務實現Job介面無法註解為spring bean 的一種解決方案

  通常情況下,我們使用quartz之後,定時任務實現Job介面,並重寫execute()方法: public class QuartzJob1 implements Job { /** * quartz回撥此介面,此介面中為定時任務具體執行內容 *

android定時任務實現

android的系統定時器功能由AlarmManager類提供 AlarmManager提供了兩個介面供使用,分別是單次和迴圈定時功能,如下:AlarmManager提供了兩個介面供使用,分別是單次和迴圈定時功能,如下: public void set(int type,

Elastic Job 定時任務實現

官方文件:http://dangdangdotcom.github.io/elastic-job/elastic-job-lite/00-overview/intro/ 該說的文件上都說了;在過程中遇到一些錯誤記下了 環境:zookeeper版本 zookeeper-3.

java定時任務實現

今天寫了一個定時任務,廢話不說上程式碼: package test.timetask; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.T

EOS Platform 7.5 tomcat伺服器,如何將NUI引用的jquery-1.6.2.min.js升級為 jquery-1.12.4.min.js

閱讀原文 【解答】 1、下載jquery-1.12.4.min.js,放置到apache-tomcat-7.0.54\webapps\default\common\nui\jquery目錄下; 2、將nui.js中 document.write('<script

定時任務實現的幾種方式

定時任務實現的幾種方式: Timer:這是java自帶的java.util.Timer類,這個類允許你排程一個java.util.TimerTask任務。使用這種方式可以讓你的程式按照某一個頻度執行,但不能在指定時間執行。一般用的較少。 ScheduledExec