1.前言
Spring 內置了quartz框架,可以對方法上註解或者在配置文件裏配置定時任務。但是如果需要對這些任務進行管理(增刪該查)的話不知道能不能做,反正我這渣渣是不知道的,所有我就自己整合了Quartz。
2.步驟
2.1 引入相關jar包
pom.xml
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
2.2 定時器執行任務類編寫
ListenJob.java
//保留任務執行後的數據,例如操作JobDataMap
@PersistJobDataAfterExecution
//不允許並非執行任務
@DisallowConcurrentExecution
public class ListenJob implements Job{
//實現Job接口的方法
public void execute(JobExecutionContext content) throws JobExecutionException {
/*任務執行內容在這裏編寫*/
System.out.println("do something");
}
}
2.3 一個任務類的執行需要有它的調度器,接下來編寫調度器
Scheduler.java
//這個@Service很關鍵
@Service
public class SchedulerJob{
//通過schedulerFactory獲取一個調度器
SchedulerFactory schedulerfactory = new StdSchedulerFactory();
Scheduler scheduler = null;
//添加任務
public void addJob(){
// 通過schedulerFactory獲取一個調度器
scheduler = schedulerfactory.getScheduler();
//初始化任務名和組名
String jobName = "jobName";
String jobGroupName = "jobGroupName";
//初始化任務(ListenJob.class)
JobDetail job = JobBuilder.newJob(ListenJob.class).withIdentity(jobName,jobGroupName).build();
//設置任務開始時間
Date startTime = new Date();
//設置任務結束時間(開始時間一小時後)
Date endTime = new Date(startTime.getTimer()+1000*60*60);
//初始化任務的觸發器(起止時間,repeatSecondlyForever(1)表示每秒執行一次)
SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().startAt(startTime).endAt(endTime).withIdentity("triggerName", "triggerGroupName") .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).repeatForever()).build();
//添加任務到調度器
scheduler.scheduleJob(job, simpleTrigger);
//開始執行
if(!scheduler.isStarted()){
scheduler.start();
}
}
//暫停任務
public void pauseJob(){
//調度器爲空
if(scheduler==null){
return;
}
try {
//觸發器和任務都要暫停
scheduler.pauseTrigger(new TriggerKey("triggerName","triggerGroupName"));
scheduler.pauseJob(new JobKey("jobName"));
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//恢復調度器
public void resumeJob(){
//
if(scheduler==null){
return;
}
//
try {
scheduler.resumeJob(new JobKey("jobName"));
scheduler.resumeTrigger(new TriggerKey("triggerName","triggerGroupName"));
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//刪除任務
public void deleteJob(){
if(scheduler==null){
return;
}
//JobKey對象
JobKey jobKey = new JobKey("jobName");
//觸發器
TriggerKey triggerKey = TriggerKey.triggerKey("triggerName", "triggerGroupName");
try {
// 停止觸發器
scheduler.pauseTrigger(triggerKey);
// 移除觸發器
scheduler.unscheduleJob(triggerKey);
//刪除任務
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
//修改任務
public void alterJob(){
// 創建一個新的觸發器
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
// 新觸發器名,觸發器組
triggerBuilder.withIdentity("newTriggerName", "newTriggerGroupName");
// 新觸發器條件設置
triggerBuilder.startNow();
triggerBuilder.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2).repeatForever());
// 創建Trigger對象
SimpleTrigger trigger = (SimpleTrigger)triggerBuilder.build();
//舊的觸發器
TriggerKey triggerKey = TriggerKey.triggerKey("triggerName", "triggerGroupName");
try {
//修改觸發器
scheduler.rescheduleJob(triggerKey, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
3.總結
以上代碼是在編輯器直接寫的,還沒跑過。如有錯誤還請告知。
實際開發中,我們還需要更多的功能,例如,任務參數的傳遞,數據持久化,任務監聽。