詳解Java中Quartz的簡單使用
Scheduler 每次執(zhí)行,都會(huì)根據(jù)JobDetail創(chuàng)建一個(gè)新的Job實(shí)例,這樣就可以規(guī)避并發(fā)訪問的問題(jobDetail的實(shí)例也是新的)
Quzrtz 定時(shí)任務(wù)默認(rèn)都是并發(fā)執(zhí)行,不會(huì)等待上一次任務(wù)執(zhí)行完畢,只要間隔時(shí)間到就會(huì)執(zhí)行,如果定時(shí)任務(wù)執(zhí)行太長,會(huì)長時(shí)間占用資源,導(dǎo)致其它任務(wù)堵塞
@DisallowConcurrentExecution: job類上,禁止并發(fā)地執(zhí)行同一個(gè)job定義 (JobDetail定義的)的多個(gè)實(shí)例。

- scheduler:可以理解為定時(shí)任務(wù)的工作容器或者說是工作場所,所有定時(shí)任務(wù)都是放在里面工作,可以開啟和停止。
- trigger:可以理解為是定時(shí)任務(wù)任務(wù)的工作規(guī)則配置,例如說,沒個(gè)幾分鐘調(diào)用一次,或者說指定每天那個(gè)時(shí)間點(diǎn)執(zhí)行。
- jobDetail:定時(shí)任務(wù)的信息,例如配置定時(shí)任務(wù)的名字,群組之類的。
- job:定時(shí)任務(wù)的真正的業(yè)務(wù)處理邏輯的地方。
簡單示例
TestClient.Java
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class TaskClient {
public static void main(String[] args) {
JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
.withIdentity("job1", "group1") //設(shè)置JOB的名字和組
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "trigger1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
.repeatForever())
.build();
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
} catch (SchedulerException ex) {
ex.printStackTrace();
}
}
}
TaskJob.Java
import cn.hutool.core.date.DateUtil;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TaskJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("TaskJob => " + DateUtil.now());
}
}

usingJobData
通過 usingJobData 往定時(shí)任務(wù)中傳遞參數(shù)
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class TaskClient {
public static void main(String[] args) {
JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
.withIdentity("job1", "group1")
.usingJobData("job","jobDetail1.JobDataMap.Value")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "trigger1")
.usingJobData("trigger","trigger.JobDataMap.Value")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
.repeatForever())
.build();
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
} catch (SchedulerException ex) {
ex.printStackTrace();
}
}
}
TaskJob.java
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TaskJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
JobDataMap triggerMap = context.getTrigger().getJobDataMap();
JobDataMap mergeMap = context.getMergedJobDataMap();
System.out.println("jobDataMap => " + jobDataMap.getString("job"));
System.out.println("triggerMap => " + triggerMap.getString("trigger"));
System.out.println("mergeMap => " + mergeMap.getString("trigger"));
}
}

通過屬性賦值
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class TaskClient {
public static void main(String[] args) {
JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
.withIdentity("job1", "group1")
.usingJobData("job","jobDetail1.JobDataMap.Value")
.usingJobData("name","jobDetail1.name.Value") //通過 setName 自動(dòng)賦值
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "trigger1")
.usingJobData("trigger","trigger.JobDataMap.Value")
.usingJobData("name","trigger.name.Value") //如果 Trigger 有值,會(huì)覆蓋 JobDetail
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
.repeatForever())
.build();
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
} catch (SchedulerException ex) {
ex.printStackTrace();
}
}
}
import org.quartz.*;
public class TaskJob implements Job {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("name => " + name);
}
}
非并發(fā)執(zhí)行
@DisallowConcurrentExecution job類上,禁止并發(fā)地執(zhí)行同一個(gè)job定義 (JobDetail定義的)的多個(gè)實(shí)例。
import cn.hutool.core.date.DateUtil;
import org.quartz.*;
@DisallowConcurrentExecution
public class TaskJob implements Job {
@Override
public void execute(JobExecutionContext context) {
System.out.println("Time => " + DateUtil.now());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}@PersistJobDataAfterExecution
持久化JobDetail中的JobDataMap(對(duì) trigger 中的 datamap 無效),如果一個(gè)任務(wù)不是
import cn.hutool.core.date.DateUtil;
import org.quartz.*;
//持久化JobDetail中的JobDataMap(對(duì) trigger 中的 datamap 無效),如果一個(gè)任務(wù)不是
@PersistJobDataAfterExecution
public class TaskJob implements Job {
@Override
public void execute(JobExecutionContext context) {
JobDataMap triggerMap = context.getJobDetail().getJobDataMap();
triggerMap.put("count", triggerMap.getInt("count") + 1);
System.out.println("Time => " + DateUtil.now() + " count =>" + triggerMap.getInt("count"));
}
}
Client
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class TaskClient {
public static void main(String[] args) {
JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
.withIdentity("job1", "group1")
.usingJobData("job","jobDetail1.JobDataMap.Value")
.usingJobData("name","jobDetail1.name.Value") //通過 setName 自動(dòng)賦值
.usingJobData("count",0) //通過 setName 自動(dòng)賦值
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "trigger1")
.usingJobData("trigger","trigger.JobDataMap.Value")
.usingJobData("name","trigger.name.Value") //如果 Trigger 有值,會(huì)覆蓋 JobDetail
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
.repeatForever())
.build();
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
} catch (SchedulerException ex) {
ex.printStackTrace();
}
}
}到此這篇關(guān)于詳解Java中Quartz的簡單使用的文章就介紹到這了,更多相關(guān)Java Quartz內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在SpringBoot中使用MongoDB完成數(shù)據(jù)存儲(chǔ)
本文主要介紹了在SpringBoot中如惡化使用MongoDB完成數(shù)據(jù)存儲(chǔ),接下來這篇我們將圍繞MongoDB進(jìn)行,MongoDB是一個(gè)開源的,面向文檔的NoSQL數(shù)據(jù)庫管理系統(tǒng),使用類似JSON的BSON(二進(jìn)制JSON)格式來存儲(chǔ)數(shù)據(jù),具有靈活的數(shù)據(jù)模型和強(qiáng)大的查詢功能,需要的朋友可以參考下2023-11-11
打包部署若依(RuoYi)SpringBoot后端和Vue前端圖文教程
若依是一個(gè)使用Spring Boot作為后端和Vue.js作為前端的全棧應(yīng)用開發(fā)平臺(tái),下面這篇文章主要給大家介紹了關(guān)于打包部署若依(RuoYi)SpringBoot后端和Vue前端的相關(guān)資料,需要的朋友可以參考下2024-05-05
Java ThreadPoolExecutor 線程池的使用介紹
Executors 是一個(gè)Java中的工具類. 提供工廠方法來創(chuàng)建不同類型的線程池,這篇文章主要介紹了Java ThreadPoolExecutor 線程池的使用介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
java 中mongodb的各種操作查詢的實(shí)例詳解
這篇文章主要介紹了java 中mongodb的各種操作查詢的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09
Java中實(shí)體與Map之間的相互轉(zhuǎn)換代碼示例
生活中經(jīng)常用到map數(shù)據(jù)與實(shí)體類的轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Java中實(shí)體與Map之間相互轉(zhuǎn)換的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12

