雜記十二 定時任務框架Quartz

2021-10-19 23:27:22 字數 4524 閱讀 5318

quartz是opensymphony開源組織在job scheduling領域又乙個開源專案。

quartz的基本組成部分:

job要點:實現job介面,重寫execute方法,方法內是具體的任務邏輯**。

public

class

printwordsjob

implements

job}

public

class

myscheduler

}

--------scheduler start ! ------------

printwordsjob start at:21-02-24 11-33-54, prints: hello job-70

printwordsjob start at:21-02-24 11-33-54, prints: hello job-11

printwordsjob start at:21-02-24 11-33-55, prints: hello job-77

printwordsjob start at:21-02-24 11-33-56, prints: hello job-87

printwordsjob start at:21-02-24 11-33-57, prints: hello job-49

下面就程式**現的幾個引數,看一下quartz框架中的幾個重要引數:

job是quartz中的乙個介面,介面下只有execute方法,在這個方法中編寫業務邏輯。

jobdetail用來繫結job,為job例項提供許多屬性。

jobdetail繫結指定的job,每次scheduler排程執行乙個job的時候,首先會拿到對應的job,然後建立該job例項,再去執行job中的execute()的內容,任務執行結束後,關聯的job物件例項會被釋放,且會被jvm gc清除。

為什麼設計成jobdetail + job,不直接使用job?

jobdetail定義的是任務資料,而真正的執行邏輯是在job中。 這是因為任務是有可能併發執行,如果scheduler直接使用job,就會存在對同乙個job例項併發訪問的問題。而jobdetail &job 方式,sheduler每次執行,都會根據jobdetail建立乙個新的job例項,這樣就可以規避併發訪問的問題。

jobexecutioncontext中包含了quartz執行時的環境以及job本身的詳細資料資訊。

當schedule排程執行乙個job的時候,就會將jobexecutioncontext傳遞給該job的execute()中,job就可以通過jobexecutioncontext物件獲取資訊。

主要資訊有:

jobdatamap實現了jdk的map介面,可以以key-value的形式儲存資料。

jobdetail、trigger都可以使用jobdatamap來設定一些引數或資訊,

job執行execute()方法的時候,jobexecutioncontext可以獲取到jobexecutioncontext中的資訊:

jobdetail jobdetail = jobbuilder.

newjob

(printwordsjob.

class).

usingjobdata

("jobdetail1"

,"這個job用來測試的").

withidentity

("job1"

,"group1").

build()

; trigger trigger = triggerbuilder.

newtrigger()

.withidentity

("trigger1"

,"triggergroup1").

usingjobdata

("trigger1"

,"這是jobdetail1的trigger").

startnow()

//立即生效

.withschedule

(******schedulebuilder.

******schedule()

.withintervalinseconds(1

)//每隔1s執行一次

.repeatforever()

).build()

;//一直執行

job執行的時候,可以獲取到這些引數資訊:

@override

public

void

execute

(jobexecutioncontext jobexecutioncontext)

throws jobexecutionexception

trigger是quartz的觸發器,會去通知scheduler何時去執行對應job。

new

trigger()

.startat()

:表示觸發器首次被觸發的時間;

newtrigger()

.endat()

:表示觸發器結束觸發的時間;

******trigger可以實現在乙個指定時間段內執行一次作業任務或乙個時間段內多次執行作業任務。

下面的程式就實現了程式執行5s後開始執行job,執行job 5s後結束執行:

date startdate =

newdate()

;startdate.

settime

(startdate.

gettime()

+5000);

date enddate =

newdate()

; enddate.

settime

(startdate.

gettime()

+5000);

trigger trigger = triggerbuilder.

newtrigger()

.withidentity

("trigger1"

,"triggergroup1").

usingjobdata

("trigger1"

,"這是jobdetail1的trigger").

startnow()

//立即生效

.startat

(startdate)

.endat

(enddate)

.withschedule

(******schedulebuilder.

******schedule()

.withintervalinseconds(1

)//每隔1s執行一次

.repeatforever()

).build()

;//一直執行

crontrigger功能非常強大,是基於日曆的作業排程,而******trigger是精準指定間隔,所以相比******trigger,crotrigger更加常用。crotrigger是基於cron表示式的,先了解下cron表示式:

由7個子表示式組成字串的,格式如下:

[秒] [分] [小時] [日] [月] [周] [年]

cron表示式的語法比較複雜,

如:* 30 10 ? * 1/5 *

表示(從後往前看)

[指定年份] 的[ 周一到周五][指定月][不指定日][上午10時][30分][指定秒]

又如:00 00 00 ? * 10,11,12 1#5 2018

表示2023年10、11、12月的第一周的星期五這一天的0時0分0秒去執行任務。

下面是給的乙個例子:

下面的**就實現了每週一到周五上午10:30執行定時任務

/**

* created by wanggenshen

* date: on 2018/7/7 20:06.

* description: ***

*/public

class

myscheduler2

}

quart定時任務

在ssm專案裡面使用quart實現定時任務每10秒插入一條資料,使用xml配置方式實現。1.建立定時任務類 package com.tencent.tusi.test.quartztest import com.tencent.tusi.business.entity.tsystemusers im...

python定時任務框架

from datetime import datetime import os import time from apscheduler.schedulers.blocking import blockingscheduler from apscheduler.schedulers.backgrou...

任務排程框架(1)系統定時任務與JDK定時任務

參考linux 的crontab命令 windows 下面的計畫任務特點 例子public static void main string args 1000l,2000l timer.schedule new timertask catch interruptedexception e 乙個任務異...