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

- scheduler:可以理解為定時任務(wù)的工作容器或者說是工作場所,所有定時任務(wù)都是放在里面工作,可以開啟和停止。
- trigger:可以理解為是定時任務(wù)任務(wù)的工作規(guī)則配置,例如說,沒個幾分鐘調(diào)用一次,或者說指定每天那個時間點執(zhí)行。
- jobDetail:定時任務(wù)的信息,例如配置定時任務(wù)的名字,群組之類的。
- job:定時任務(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 往定時任務(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 自動賦值
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "trigger1")
.usingJobData("trigger","trigger.JobDataMap.Value")
.usingJobData("name","trigger.name.Value") //如果 Trigger 有值,會覆蓋 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í)行同一個job定義 (JobDetail定義的)的多個實例。
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(對 trigger 中的 datamap 無效),如果一個任務(wù)不是
import cn.hutool.core.date.DateUtil;
import org.quartz.*;
//持久化JobDetail中的JobDataMap(對 trigger 中的 datamap 無效),如果一個任務(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 自動賦值
.usingJobData("count",0) //通過 setName 自動賦值
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "trigger1")
.usingJobData("trigger","trigger.JobDataMap.Value")
.usingJobData("name","trigger.name.Value") //如果 Trigger 有值,會覆蓋 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在SpringBoot中使用MongoDB完成數(shù)據(jù)存儲
本文主要介紹了在SpringBoot中如惡化使用MongoDB完成數(shù)據(jù)存儲,接下來這篇我們將圍繞MongoDB進行,MongoDB是一個開源的,面向文檔的NoSQL數(shù)據(jù)庫管理系統(tǒng),使用類似JSON的BSON(二進制JSON)格式來存儲數(shù)據(jù),具有靈活的數(shù)據(jù)模型和強大的查詢功能,需要的朋友可以參考下2023-11-11
打包部署若依(RuoYi)SpringBoot后端和Vue前端圖文教程
若依是一個使用Spring Boot作為后端和Vue.js作為前端的全棧應(yīng)用開發(fā)平臺,下面這篇文章主要給大家介紹了關(guān)于打包部署若依(RuoYi)SpringBoot后端和Vue前端的相關(guān)資料,需要的朋友可以參考下2024-05-05
Java ThreadPoolExecutor 線程池的使用介紹
Executors 是一個Java中的工具類. 提供工廠方法來創(chuàng)建不同類型的線程池,這篇文章主要介紹了Java ThreadPoolExecutor 線程池的使用介紹,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

