java 动态添加定时器_quartz实现任务动态增加和删除
場景
這幾天做項目的時候遇到了個狀態自動切換的場景。該場景具體情況如下:
用戶可以創建多個活動
活動有開始時間和結束時間
活動有個狀態:未上線、未開始(上線但未到開始時間)、進行中(上線且處于開始時間和結束時間之間)、已結束(上線且處于活動結束時間之后)
在上訴條件下自動切換活動狀態,切換時間點為:活動開始時間(未開始->進行中);活動結束時間(進行中->已結束)
分析
根據場景中出現的情況,一個定時器就可以解決問題,只需要添加定時任務在指定時間進行活動狀態切換即可??梢栽诨顒由暇€的時候為每個活動創建一個定時任務,由于活動可以在進行中下線,所以在執行上線操作的時候需要判斷上線后的活動狀態,然后根據活動當前狀態創建當時任務;在活動下線的時候關閉該活動的任務。
java解決定時任務的方法較為常用的是有兩種方法:java.util.Timer 和org.quartz;這兩種方式各有起優缺點,Timer實現起來非常簡單,只需要實現一個TimerTask即可進行定時任務調度,但是Timer定時任務存在幾個缺點導致在實際開發中很少用其作為定時器,以下是timer和quartz相比的不足:
java定時器沒有持久化機制
java定時器的日程管理不夠靈活
java定時器沒有使用線程池
java定時器么有確切的管理方案
生成環境中更多是使用quartz來做定時任務的開發,本文主要講解quartz如何添加定時任務和刪除定時任務。
quartz介紹
Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的程序。Jobs可以做成標準的Java組件或 EJBs。
job quartz核心任務接口,實現execute方法即可
jobDetail quartz為調度器可以識別的任務詳情對象,該對象包含任務的唯一key值,以及任務人發執行所需參數等
trigger 任務執行觸發器,指定任務執行時間等
scheduler quartz核心調度器,將jobDetail和trigger結合起來調度定時任務
實現案例(并非解決上訴場景代碼)
實現Job接口
package java;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* Created by Lethe on 2017/3/29.
* 該任務將在被觸發的時候將輸出: hello ${name}
*/
public class QuartzJob implements Job {
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap map = jobExecutionContext.getJobDetail().getJobDataMap();
System.out.println("hello "+ map.getString("name"));
}
}
任務調度
package org.hanmeis;
import org.quartz.JobDataMap;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.JobDetailImpl;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.triggers.CronTriggerImpl;
import java.text.ParseException;
/**
* Created by Lethe on 2017/3/29.
*/
public class SchedulerTest {
public static void main(String[] args) throws SchedulerException, ParseException {
// 構造調度器,使用標準調度器工廠獲取默認的調度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
JobDataMap dataMap = new JobDataMap();
dataMap.put("name", "world");
// 構造JobDetail,使用默認的JobDetailImpl類
JobDetailImpl detail = new JobDetailImpl();
detail.setJobClass(QuartzJob.class);
detail.setJobDataMap(dataMap);
detail.setName("testJob");
// 構造Trigger,使用CronTrigger
CronTriggerImpl cronTrigger = new CronTriggerImpl();
cronTrigger.setCronExpression("00 * 15 29 3 ? 2017");// 如果僅需在指定時間執行一次任務,則表達式一般寫法為:00 50 15 29 3 ? 2017(表示在2017-03-29 15:50:00執行任務)
cronTrigger.setName("testTrigger");
// 調度任務
scheduler.scheduleJob(detail, cronTrigger);
}
}
任務動態增加和刪除
scheduler本身提供任務的裝載、卸載及刷新等接口
Date scheduleJob(JobDetail jobDetail, Trigger trigger) throws SchedulerException;
Date scheduleJob(Trigger trigger) throws SchedulerException;
void scheduleJobs(Map> triggersAndJobs, boolean replace) throws SchedulerException;
void scheduleJob(JobDetail jobDetail, Set extends Trigger> triggersForJob, boolean replace) throws SchedulerException;
boolean unscheduleJob(TriggerKey triggerKey) throws SchedulerException;
boolean unscheduleJobs(List triggerKeys) throws SchedulerException;
Date rescheduleJob(TriggerKey triggerKey, Trigger newTrigger) throws SchedulerException;
引用
quartz[互動百科]:http://www.baike.com/wiki/Quartz
Timer和spring的Quartz兩種定時器的區別[CSDN]:http://blog.csdn.net/zlxdream815/article/details/8177574
總結
以上是生活随笔為你收集整理的java 动态添加定时器_quartz实现任务动态增加和删除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php查询字段前30个字符,php/js
- 下一篇: 数值传热学陶文铨pdf_西安交大陶文铨当