日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 调度quartz,java quartz任务调度

發布時間:2024/4/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 调度quartz,java quartz任务调度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.quartz的結構

quartz包括了3個部分:任務、觸發器和調度器。

(1)任務

Job:是一個接口。要定義自己的任務,必須繼承該接口。該接口只用一個方法void execute(JobExecutionContext context),JobExecutionContext類提供了調度上下文的各種信息。Job運行時的信息保存在JobDataMap實例中。

JobDetail:該類的作用是給自定義的任務綁定組名以及Job名,用來在Scheduler中區分每個Job。該類的構造方法為JobDetail(java.lang.String name, java.lang.String group, java.lang.Class jobClass)。

(2)觸發器

Trigger:該類的作用是描述Job的執行時間規則,有SimpleTrigger和CronTrigger兩個子類。SimpleTrigger用來描述一次觸發或者是固定的時間間隔,CronTrigger則是通過Cron表達式規定固定的時間點。

Calendar:該類表示是特定時間點的集合。一個Trigger可以對應多個Calendar,用來排除或者添加特定的時間點。其下有若干個實現類,如AnnualCalendar、MonthlyCalendar、WeeklyCalendar分別針對每年、每月和每周進行定義。

(3)調度器

Scheduler:該類是quartz的運行容器,Trigger和JobDetail可以注冊到Scheduler中,兩者在Scheduler中擁有各自的組及名稱,組及名稱是Scheduler查找定位容器中某一對象的依據,Trigger的組及名稱必須唯一,JobDetail的組和名稱也必須唯一(但可以和Trigger的組和名稱相同,因為它們是不同類型的)。Scheduler可以將Trigger綁定到某一JobDetail中,這樣當Trigger觸發時,對應的Job就被執行。一個Job可以對應多個Trigger,但一個Trigger只能對應一個Job。

ThreadPool:Scheduler使用一個線程池作為任務運行的基礎設施,任務通過共享線程池中的線程提高運行效率。

2.quartz使用實例

public class PrintJob implements Job {

@Override

public void execute(JobExecutionContext context) throws JobExecutionException {

System.out.println("executing this job");

}

}

(1)使用SimpleTrigger

public static void main(String[] args) throws SchedulerException {

JobDetail detail = new JobDetail("jName", "jGroup", PrintJob.class);

SimpleTrigger trigger = new SimpleTrigger("stName", "stGroup");

// 當前時間為開始時間

trigger.setStartTime(new Date());

// 每隔2秒執行一次

trigger.setRepeatInterval(2000);

// 執行10次

trigger.setRepeatCount(10);

SchedulerFactory factory = new StdSchedulerFactory();

Scheduler scheduler = factory.getScheduler();

// JobDetail與Trigger關聯

scheduler.scheduleJob(detail, trigger);

scheduler.start();

}

在構造Trigger實例時,可以考慮使用org.quartz.TriggerUtils工具類,該工具類不但提供了眾多獲取特定時間的方法,還擁有眾多獲取常見Trigger的方法。

(2)使用CronTrigger

Cron表達式時間字段

位置

時間域名

允許值

允許的特殊字符

1

0-59

, – * /

2

分鐘

0-59

, – * /

3

小時

0-23

, – * /

4

日期

1-31

, – * ? / L W C

5

月份

1-12

, – * /

6

星期

1-7

, – * ? / L C #

7

年(可選)

空值1970-2099

, – * /

●星號(*):可用在所有字段中,表示對應時間域的每一個時刻,例如,*在分鐘字段時,表示“每分鐘”;

●問號(?):該字符只在日期和星期字段中使用,它通常指定為“無意義的值”,相當于點位符(當日期或者星期存在一個時,另一個可以設置為?);

●減號(-):表達一個范圍,如在小時字段中使用“10-12”,則表示從10到12點,即10,11,12;

●逗號(,):表達一個列表值,如在星期字段中使用“MON,WED,FRI”,則表示星期一,星期三和星期五;

●斜杠(/):x/y表達一個等步長序列,x為起始值,y為增量步長值。如在秒字段中使用0/15,則表示為0,15,30和45秒,而5/15在分鐘字段中表示5,20,35,50分,你也可以使用*/y,它等同于0/y;

●L:該字符只在日期和星期字段中使用,代表“Last”的意思,但它在兩個字段中意思不同。L在日期字段中,表示這個月份的最后一天,如一月的31號,非閏年二月的28號;如果L用在星期中,則表示星期六,等同于7。但是,如果L出現在星期字段里,而且在前面有一個數值X,則表示“這個月的最后X天”,例如,6L表示該月的最后星期五;

●W:該字符只能出現在日期字段里,是對前導日期的修飾,表示離該日期最近的工作日。例如15W表示離該月15號最近的工作日,如果該月15號是星期六,則匹配14號星期五;如果15日是星期日,則匹配16號星期一;如果15號是星期二,那結果就是15號星期二。但必須注意關聯的匹配日期不能夠跨月,如你指定1W,如果1號是星期六,結果匹配的是3號星期一,而非上個月最后的那天。W字符串只能指定單一日期,而不能指定日期范圍;

●LW組合:在日期字段可以組合使用LW,它的意思是當月的最后一個工作日;

●井號(#):該字符只能在星期字段中使用,表示當月某個工作日。如6#3表示當月的第三個星期五(6表示星期五,#3表示當前的第三個),而4#5表示當月的第五個星期三,假設當月沒有第五個星期三,忽略不觸發;

●C:該字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是計劃所關聯的日期,如果日期沒有被關聯,則相當于日歷中所有日期。例如5C在日期字段中就相當于日歷5日以后的第一天。1C在星期字段中相當于星期日后的第一天。

表示式

說明

0 15 10 ? * *

每天10:15運行

0 15 10 * * ?

每天10:15運行

0 15 10 * * ? 2008

在2008年的每天10:15運行

0 * 14 * * ?

每天14點到15點之間每分鐘運行一次,開始于14:00,結束于14:59

0 0/5 14 * * ?

每天14點到15點每5分鐘運行一次,開始于14:00,結束于14:55

0 0/5 14,18 * * ?

每天14點到15點每5分鐘運行一次,此外每天18點到19點每5鐘也運行一次

0 0-5 14 * * ?

每天14:00點到14:05,每分鐘運行一次

0 15 10 ? * MON-FRI

每周一,二,三,四,五的10:15分運行

0 15 10 L * ?

每月最后一天10:15分運行

0 15 10 ? * 6L

每月最后一個星期五10:15分運行

0 15 10 ? * 6#3

每月第三個星期五的10:15分運行

public static void main(String[] args) throws SchedulerException {

JobDetail detail = new JobDetail("jName", "jGroup", PrintJob.class);

CronTrigger trigger = new CronTrigger("ctName", "ctGroup");

// 定義表達式

CronExpression cexp = new CronExpression("0/5 * * * * ?");

trigger.setCronExpression(cexp);

SchedulerFactory factory = new StdSchedulerFactory();

Scheduler scheduler = factory.getScheduler();

// JobDetail與Trigger關聯

scheduler.scheduleJob(detail, trigger);

scheduler.start();

}

(3)使用Calendar

public static void main(String[] args) throws SchedulerException {

// 法定節日是以每年為周期的,所以使用AnnualCalendar

AnnualCalendar holidays = new AnnualCalendar();

// 五一勞動節

Calendar laborDay = new GregorianCalendar();

laborDay.add(Calendar.MONTH, 5);

laborDay.add(Calendar.DATE, 1);

// 排除的日期,如果設置為false則為包含

holidays.setDayExcluded(laborDay, true);

// 國慶節

Calendar nationalDay = new GregorianCalendar();

nationalDay.add(Calendar.MONTH, 10);

nationalDay.add(Calendar.DATE, 1);

holidays.setDayExcluded(nationalDay, true);

SchedulerFactory factory = new StdSchedulerFactory();

Scheduler scheduler = factory.getScheduler();

scheduler.addCalendar("holidays", holidays, false, true);

// 設置JobDetail與Trigger

...

scheduler.start();

}

3.spring配置quartz

使用spring,自定義任務不用實現Job接口:

public class PrintJob {

public void execute() {

System.out.println("executing this job");

}

}

spring-quartz.xml

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

加載配置文件便可以執行:

public static void main(String[] args) throws SchedulerException {

ApplicationContext context = new ClassPathXmlApplicationContext("com/ee/test/quartz/spring-quartz.xml");

}

總結

以上是生活随笔為你收集整理的java 调度quartz,java quartz任务调度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。