1. 程式人生 > >spring quartz實現定時任務、延時任務的動態增、刪、改、查

spring quartz實現定時任務、延時任務的動態增、刪、改、查

配置見前面兩篇部落格

首先我需要的quartz相關的資訊包括任務名稱、任務組名稱、作業開始時間、作業結束時間等,定義一個類UniQuartzBean用於儲存這些屬性:

import java.util.Date;

public class UniQuartzBean {
	private String jobName; // 作業名稱
	private String jobGroupName; // 作業組名稱
	private String oldJobName; // 作業名稱
	private String oldJobGroupName; // 作業組名稱
	
	private String schedulerInstanceId;	// 排程器ID
	private String schedulerName;		// 排程器名稱
	private String triggerName;		// 觸發器名稱
	private String triggerGroupName;		// 觸發器組名稱
	private String jobClass;		// 處理類名稱
	private String description;		// 任務描述
	
	private Date startTime;		// 作業開始啟動時間
	private Date previousTime;		// 上一次啟動時間
	private Date nextTime;		// 下一次啟動時間
	private Date endTime;		// 結束時間
	
	private int repeatCount;	// 作業需要執行的次數(計數任務)
	private long repeatInterval; // 執行時間間隔
	private int timesTriggered;	// 已經執行的次數
	private String cronExpression; // 執行的時間表達式(定時任務)
	private String triggerState; // 作業狀態
	
	private String jobId;		// FireInstanceId 獨一無二的標識,在獲取正在執行的任務時用到
	private Long jobRunTime;	// 作業的執行時間,只有當作業完成時才會獲取到值,沒有完成時返回-1
	/**
	 * 
    None:Trigger已經完成,且不會在執行,或者找不到該觸發器,或者Trigger已經被刪除<br />
    NORMAL:正常狀態<br />
    PAUSED:暫停狀態<br />
    COMPLETE:觸發器完成,但是任務可能還正在執行中<br />
    BLOCKED:執行緒阻塞狀態<br />
    ERROR:出現錯誤<br />
	 */
	private String triggerType; // 觸發器型別
	private String timeZone;	// timeZone
	
	private boolean isConcurrent;	// 是否支援併發執行
	
	public UniQuartzBean() {
		super();
	}
	
	// 暫停、恢復時可以使用
	public UniQuartzBean(String jobName, String jobGroupName) {
		super();
		this.jobName = jobName;
		this.jobGroupName = jobGroupName;
	}
	
	// 修改作業排程時間可以用到
	public UniQuartzBean(String jobName, String jobGroupName, String oldJobName, String oldJobGroupName) {
		super();
		this.jobName = jobName;
		this.jobGroupName = jobGroupName;
		this.oldJobName = oldJobName;
		this.oldJobGroupName = oldJobGroupName;
	}
    ...Set、Get函式
}

此外修改配置任務需要配置其任務時間間隔、任務次數、何時結束等,定義一個類來儲存這些屬性

public class UniQuartzConfig {
	/**
	 * 是否是定時任務?	<br/>
	 * 如果是定時任務,設定true;預設為true<br/>
	 * 如果是即時任務或計數執行,則設定為false;
	 * @return
	 */
	private boolean isTimedTask = true;
	
	/**
	 * 定時任務執行時,設定一個時間的正則表示式;<br />
	 * 如:'0/5 * * * * ?'
	 * @return
	 */
	private String cron = "";
	
	/**
	 * 即時任務或計數執行需要設定,表示在當前時間之後間隔delayTime後執行;<br />
	 * 時間間隔型別見delayTimeType;<br />
	 * 預設延時啟動時間為0,表示立即開始執行;
	 * @return
	 */
	private int delayTime = 0;
	
	/**
	 * 設定延時啟動時間間隔的時間是什麼型別的,預設為'秒';<br />
	 * IntervalUnit.MILLISECOND 毫秒<br />
	 * IntervalUnit.SECOND	秒<br />
	 * IntervalUnit.MINUTE	分<br />
	 * IntervalUnit.HOUR	小時<br />
	 * IntervalUnit.DAY		天<br />
	 * IntervalUnit.WEEK	周<br />
	 * IntervalUnit.MONTH	月<br />
	 * IntervalUnit.YEAR	年
	 * @return
	 */
	private IntervalUnit delayTimeType = IntervalUnit.SECOND;
	
	/**
	 * 計數執行每次執行任務之間的“間隔時間”設定,預設為1<br/>
	 * “間隔時間”型別,見“intervalTimeType”
	 * @return
	 */
	private int intervalTime = 1;
	
	/**
	 * 計數執行“間隔時間”是什麼型別的,預設為'秒';<br />
	 * IntervalUnit.MILLISECOND 毫秒<br />
	 * IntervalUnit.SECOND	秒<br />
	 * IntervalUnit.MINUTE	分<br />
	 * IntervalUnit.HOUR	小時<br />
	 * @return
	 */
	private IntervalUnit intervalTimeType = IntervalUnit.SECOND;
	
	/**
	 * “計數執行”的重複次數,預設為1; <br />
	 * 當設定為“0”時,表示一直重複; <br />
	 * 當這是為“-1”時,表示在某一刻時間結束,需要設定結束的時間endTime,endTimeType;
	 * @return
	 */
	private int repeatCount = 1;
	
	/**
	 * 多少時間之後,該任務停止; <br />
	 * 時間型別見“endTimeType”
	 * @return
	 */
	private int endTime = 0;
	
	/**
	 * 結束時間間隔型別 ,預設設定為秒;其他時間設定如下 <br />
	 * IntervalUnit.MILLISECOND 毫秒<br />
	 * IntervalUnit.SECOND	秒<br />
	 * IntervalUnit.MINUTE	分<br />
	 * IntervalUnit.HOUR	小時<br />
	 * IntervalUnit.DAY		天<br />
	 * IntervalUnit.WEEK	周<br />
	 * IntervalUnit.MONTH	月<br />
	 * IntervalUnit.YEAR	年
	 * @return
	 */
	private IntervalUnit endTimeType = IntervalUnit.SECOND;

	public static UniQuartzConfig newInstance() {
		return new UniQuartzConfig();
	}
	
	private UniQuartzConfig() {
		super();
	}

	...Set、Get函式
	
}

接下來就是service類,實現對任務的增刪改查:

@Component
public class UniQuartzService implements UniQuartz {
	@Autowired
	private Scheduler quartzScheduler;

	/**
	 * 
	 * @param uqb
	 *            任務名稱、任務組名稱
	 * @param uqc
	 *            任務的配置資訊
	 * @param quartzClass
	 *            任務執行的類
	 * @param parameter
	 *            給任務傳遞的引數上下文
	 * @return
	 */
	@Override
	public boolean addJob(UniQuartzBean uqb, UniQuartzConfig uqc, Class<? extends Job> quartzClass, Object parameter) {
		try {
			// 判斷觸發器是否存在
			boolean exist = isTriggerExist(uqb);

			// 獲取觸發器,不存在觸發器時建立一個
			Trigger trigger = getTrigger(uqb, uqc);
			if (exist) {
				if (!ObjectUtils.isEmpty(parameter)) {
					trigger.getJobDataMap().put("context", parameter); // 傳遞上下文資料給定時任務
				}
				TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
				quartzScheduler.rescheduleJob(triggerKey, trigger);
			} else {
				// 建立JobDetail,並傳遞引數
				JobDetail jobDetail = getNewJob(uqb, quartzClass);
				if (!ObjectUtils.isEmpty(parameter)) {
					jobDetail.getJobDataMap().put("context", parameter);
				}
				// 排程任務
				quartzScheduler.scheduleJob(jobDetail, trigger);
				//quartzScheduler.start();
			}
			System.out.println(JSON.toJSONString(uqc));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return true;
	}

	/**
	 * 修改任務的時間
	 * 
	 * @param uqb
	 * @param uqc
	 * @return
	 */
	@Override
	public boolean modifyJobTime(UniQuartzBean uqb, UniQuartzConfig uqc) {
		try {
			if (isTriggerExist(uqb) == false) {
				System.err.println("不存在[JobName=" + uqb.getJobName() + ",JobGroupName=" + uqb.getJobGroupName());
				return false;
			} else {
				addJob(uqb, uqc, null, null);
				return true;
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 修改任務的時間
	 * 
	 * @param jobName
	 * @param jobGroupName
	 * @param uqc
	 * @return
	 */
	@Override
	public boolean modifyJobTime(String jobName, String jobGroupName, UniQuartzConfig uqc) {
		UniQuartzBean uqb = new UniQuartzBean(jobName, jobGroupName);
		return modifyJobTime(uqb, uqc);
	}

	/**
	 * 暫停任務
	 */
	@Override
	public boolean pauseJob(UniQuartzBean uqb) {
		return pauseJob(uqb.getJobName(), uqb.getJobGroupName());
	}

	/**
	 * 暫停任務
	 */
	@Override
	public boolean pauseJob(String jobName, String jobGroupName) {
		JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
		try {
			// 暫停觸發器
			quartzScheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));
			quartzScheduler.pauseJob(jobKey);
			return true;
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 暫停所有任務
	 */
	@Override
	public boolean pauseAllJob() {
		try {
			quartzScheduler.pauseAll();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return true;
	}

	/**
	 * 恢復任務
	 */
	@Override
	public boolean resumeJob(UniQuartzBean uqb) {
		return resumeJob(uqb.getJobName(), uqb.getJobGroupName());
	}

	/**
	 * 恢復任務
	 */
	@Override
	public boolean resumeJob(String jobName, String jobGroupName) {
		JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
		try {
			// 恢復觸發器
			quartzScheduler.resumeTrigger(TriggerKey.triggerKey(jobName, jobGroupName));
			quartzScheduler.resumeJob(jobKey);
			return true;
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 恢復任務
	 */
	@Override
	public void resumeAllJob() {
		try {
			quartzScheduler.resumeAll();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 刪除任務
	 */
	@Override
	public boolean deleteJob(UniQuartzBean uqb) {
		return deleteJob(uqb.getJobName(), uqb.getJobGroupName());
	}

	/**
	 * 刪除任務
	 */
	@Override
	public boolean deleteJob(String jobName, String jobGroupName) {
		JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
		try {
			// 停止觸發器
			quartzScheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));
			// 移除觸發器
			quartzScheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName));
			// 刪除任務
			quartzScheduler.deleteJob(jobKey);
			return true;
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 停止排程器觸發觸發器,清理與排程器相關的所有資源。相當於關閉(false)。無法重新啟動排程程式。
	 */
	@Override
	public void shutdown() {
		try {
			quartzScheduler.shutdown();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 判斷觸發器是否存在
	 * 
	 * @param uqb
	 * @param trigName
	 * @param trigGroupName
	 * @return
	 * @throws SchedulerException
	 */
	private boolean isTriggerExist(UniQuartzBean uqb) throws SchedulerException {
		boolean bExist = false;
		TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
		Trigger trigger = quartzScheduler.getTrigger(triggerKey);
		if (!ObjectUtils.isEmpty(trigger)) {
			bExist = true;
		}
		return bExist;
	}

	/**
	 * 獲取觸發器,觸發器之前存在則返回;不存在,則建立之後返回;
	 * 
	 * @param uqb
	 * @param uqc
	 * @return
	 * @throws SchedulerException
	 */
	private Trigger getTrigger(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
		return uqc.isTimedTask() ? configCronTrigger(uqb, uqc) : configSimpleTrigger(uqb, uqc);
	}

	/**
	 * 定時任務-配置觸發器
	 * 
	 * @param uqb
	 * @param uqc
	 * @return
	 * @throws SchedulerException
	 */
	private Trigger configCronTrigger(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
		Trigger trigger = null;
		ScheduleBuilder<?> scheduleBuilder = getScheduleBuilder(uqc);
		if (isTriggerExist(uqb)) { // 存在
			System.out.println("定時任務-配置觸發器---存在");
			TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
			trigger = quartzScheduler.getTrigger(triggerKey);
			trigger = ((CronTrigger) trigger).getTriggerBuilder().withIdentity(uqb.getJobName(), uqb.getJobGroupName())
					.withSchedule((CronScheduleBuilder) scheduleBuilder).withDescription(uqb.getDescription()).build();
		} else { // 不存在
			System.out.println("定時任務-配置觸發器---不存在");
			trigger = TriggerBuilder.newTrigger().withIdentity(uqb.getJobName(), uqb.getJobGroupName())
					.withSchedule(scheduleBuilder).withDescription(uqb.getDescription()).build();
		}
		return trigger;
	}

	/**
	 * 建立排程器
	 * 
	 * @param uqa
	 * @return
	 */
	private ScheduleBuilder<?> getScheduleBuilder(UniQuartzConfig uqc) {
		ScheduleBuilder<?> scheduleBuilder = null;
		if (uqc.isTimedTask()) { // 定時任務
			scheduleBuilder = CronScheduleBuilder.cronSchedule(uqc.getCron());
		} else { // 即時任務、計數任務
			scheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
		}
		return scheduleBuilder;
	}

	/**
	 * 配置即時任務、定時任務的延時、延時種類、執行間隔、執行間隔種類、重複次數、結束時間、結束時間種類
	 * 
	 * @param uqb
	 * @param uqc
	 * @return
	 * @throws SchedulerException
	 */
	private Trigger configSimpleTrigger(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
		System.out.println("配置Simple觸發器.迴圈次數" + uqc.getRepeatCount());
		if (uqc.getRepeatCount() == -1) { // 表示在某一時刻結束,需要設定結束時間
			System.out.println("在某一刻結束-觸發器");
			return configSimpleTriggerEnd(uqb, uqc);
		} else if (uqc.getRepeatCount() == 0) { // 表示一直重複
			System.out.println("一直重複執行-觸發器....");
			return configSimpleTriggerForever(uqb, uqc);
		} else { // 計數執行
			System.out.println("計數執行-觸發器...");
			return configSimpleTriggerCount(uqb, uqc);
		}
	}

	/**
	 * 在某一時刻結束
	 * 
	 * @param trigName
	 * @param trigGroupName
	 * @param uqa
	 * @return
	 * @throws SchedulerException
	 */
	private Trigger configSimpleTriggerEnd(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
		Trigger trigger = null;
		TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
		SimpleScheduleBuilder scheduleBuilder = (SimpleScheduleBuilder) getScheduleBuilder(uqc);
		// 延時啟動時間
		Date startDate = DateBuilder.futureDate(uqc.getDelayTime(), uqc.getDelayTimeType());
		// 結束時間
		Date endDate = DateBuilder.futureDate(uqc.getEndTime(), uqc.getEndTimeType());
		// 配置時間間隔
		scheduleBuilder = configSimpleTriggerInterval(scheduleBuilder, uqc);
		scheduleBuilder = scheduleBuilder.repeatForever();
		if (isTriggerExist(uqb)) {
			trigger = quartzScheduler.getTrigger(triggerKey);

			trigger = ((SimpleTrigger) trigger).getTriggerBuilder()
					.withIdentity(uqb.getJobName(), uqb.getJobGroupName()).withSchedule(scheduleBuilder)
					.withDescription(uqb.getDescription()).startAt(startDate).endAt(endDate).build();
			System.out.println("即時任務-某時間結束-配置觸發器---存在");
		} else {
			System.out.println("即時任務-某時間結束-配置觸發器---不存在");
			// 構建排程器
			trigger = TriggerBuilder.newTrigger().withIdentity(uqb.getJobName(), uqb.getJobGroupName())
					.withDescription(uqb.getDescription()).withSchedule(scheduleBuilder).startAt(startDate)
					.endAt(endDate).build();
		}
		return trigger;
	}

	/**
	 * 配置觸發器啟動時間間隔、間隔型別
	 * 
	 * @param scheduleBuilder
	 * @param uqa
	 */
	private SimpleScheduleBuilder configSimpleTriggerInterval(SimpleScheduleBuilder scheduleBuilder,
			UniQuartzConfig uqc) {
		SimpleScheduleBuilder res = scheduleBuilder;
		if (uqc.getIntervalTime() > 0) { // 間隔時間大於0時設定
			System.out.println("設定的間隔時間大於0");
			switch (uqc.getIntervalTimeType()) {
			case MILLISECOND:
				System.out.println("時間間隔為毫秒:" + uqc.getIntervalTime());
				res = scheduleBuilder.withIntervalInMilliseconds(uqc.getIntervalTime());
				break;
			case SECOND:
				System.out.println("時間間隔為秒:" + uqc.getIntervalTime());
				res = scheduleBuilder.withIntervalInSeconds(uqc.getIntervalTime());
				break;
			case MINUTE:
				System.out.println("時間間隔為分:" + uqc.getIntervalTime());
				res = scheduleBuilder.withIntervalInMinutes(uqc.getIntervalTime());
				break;
			case HOUR:
				System.out.println("時間間隔為小時:" + uqc.getIntervalTime());
				res = scheduleBuilder.withIntervalInHours(uqc.getIntervalTime());
				break;
			default:
				System.err.println("這是不支援的排程間隔時間:" + uqc.getIntervalTimeType());
				break;
			}
		} else {
			System.err.println("設定的時間間隔必須大於0.");
		}
		return res;
	}

	/**
	 * 一直重複執行
	 * 
	 * @param uqb
	 * @param uqc
	 * @return
	 * @throws SchedulerException
	 */
	private Trigger configSimpleTriggerForever(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
		Trigger trigger = null;
		TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
		SimpleScheduleBuilder scheduleBuilder = (SimpleScheduleBuilder) getScheduleBuilder(uqc);
		// 延時啟動時間
		Date startDate = DateBuilder.futureDate(uqc.getDelayTime(), uqc.getDelayTimeType());
		// 配置時間間隔
		scheduleBuilder = configSimpleTriggerInterval(scheduleBuilder, uqc);
		scheduleBuilder = scheduleBuilder.repeatForever();// 一直重複
		if (isTriggerExist(uqb)) {
			trigger = quartzScheduler.getTrigger(triggerKey);

			trigger = ((SimpleTrigger) trigger).getTriggerBuilder()
					.withIdentity(uqb.getJobName(), uqb.getJobGroupName()).withSchedule(scheduleBuilder)
					.withDescription(uqb.getDescription()).startAt(startDate).build();
			System.out.println("即時任務-重複執行-配置觸發器---存在");
		} else {
			System.out.println("即時任務-重複執行-配置觸發器---不存在");
			// 構建排程器
			trigger = TriggerBuilder.newTrigger().withIdentity(uqb.getJobName(), uqb.getJobGroupName())
					.withDescription(uqb.getDescription()).withSchedule(scheduleBuilder).startAt(startDate).build();
		}
		return trigger;
	}

	/**
	 * 執行一定的次數
	 * 
	 * @param uqb
	 * @param uqc
	 * @return
	 * @throws SchedulerException
	 */
	private Trigger configSimpleTriggerCount(UniQuartzBean uqb, UniQuartzConfig uqc) throws SchedulerException {
		Trigger trigger = null;
		TriggerKey triggerKey = TriggerKey.triggerKey(uqb.getJobName(), uqb.getJobGroupName());
		SimpleScheduleBuilder scheduleBuilder = (SimpleScheduleBuilder) getScheduleBuilder(uqc);
		// 延時啟動時間
		Date startDate = DateBuilder.futureDate(uqc.getDelayTime(), uqc.getDelayTimeType());
		// 配置時間間隔
		scheduleBuilder = configSimpleTriggerInterval(scheduleBuilder, uqc);
		scheduleBuilder = scheduleBuilder.withRepeatCount(uqc.getRepeatCount() - 1); // 設定重複次數
		if (isTriggerExist(uqb)) {
			System.out.println("是否存在---------------------2:" + "存在");
			trigger = quartzScheduler.getTrigger(triggerKey);

			trigger = ((SimpleTrigger) trigger).getTriggerBuilder()
					.withIdentity(uqb.getJobName(), uqb.getJobGroupName()).withSchedule(scheduleBuilder)
					.withDescription(uqb.getDescription()).startAt(startDate).build();
		} else {
			System.out.println("是否存在---------------------2:" + "不存在");
			// 構建排程器
			trigger = TriggerBuilder.newTrigger().withIdentity(uqb.getJobName(), uqb.getJobGroupName())
					.withDescription(uqb.getDescription()).withSchedule(scheduleBuilder).startAt(startDate).build();
		}
		return trigger;
	}

	/**
	 * 建立一個新的作業
	 * 
	 * @param uniSchTrig
	 * @param quartzClass
	 * @return
	 */
	private JobDetail getNewJob(UniQuartzBean uqb, Class<? extends Job> quartzClass) {
		JobDetail jobDetail = JobBuilder.newJob(quartzClass).withIdentity(uqb.getJobName(), uqb.getJobGroupName())
				.build();
		return jobDetail;
	}

	private UniQuartzBean getJob(JobKey jobKey, Trigger trigger) {
		UniQuartzBean uniQuartzBean = null;
		try {
			String jobName = jobKey.getName();
			String jobGroupName = jobKey.getGroup();
			// Trigger trigger = quartzScheduler.getTrigger(triggerKey);
			if (!ObjectUtils.isEmpty(trigger)) {
				uniQuartzBean = new UniQuartzBean();
				// 獲取任務基本資訊,作業名稱、作業組名稱、觸發器名稱、觸發器組名稱
				uniQuartzBean.setJobName(jobName).setJobGroupName(jobGroupName).setTriggerName(jobName)
						.setTriggerGroupName(jobGroupName);
				// 獲取排程器基本資訊,排程器ID、排程器名稱、處理類名稱、任務描述、作業狀態
				uniQuartzBean.setSchedulerInstanceId(quartzScheduler.getSchedulerInstanceId())
						.setSchedulerName(quartzScheduler.getSchedulerName());
				JobDetail jobDetail = quartzScheduler.getJobDetail(jobKey);
				uniQuartzBean.setJobClass("" + jobDetail.getJobClass()).setDescription(trigger.getDescription())
						.setTriggerState(quartzScheduler.getTriggerState(trigger.getKey()).name());
				// 獲取作業的啟動時間資訊
				uniQuartzBean.setStartTime(trigger.getStartTime()).setPreviousTime(trigger.getPreviousFireTime())
						.setNextTime(trigger.getNextFireTime()).setEndTime(trigger.getEndTime());
				// 是否支援併發
				uniQuartzBean.setConcurrent(jobDetail.isConcurrentExectionDisallowed());
				// 獲取需要執行的次數、執行間隔、已經執行的次數、時間表達式
				if (trigger instanceof CronTrigger) {
					CronTrigger cronTrigger = (CronTrigger) trigger;
					uniQuartzBean.setTriggerType("CronTrigger");
					uniQuartzBean.setCronExpression(cronTrigger.getCronExpression())
							.setTimeZone(cronTrigger.getTimeZone().getID());
				} else if (trigger instanceof SimpleTrigger) {
					SimpleTrigger simpleTrigger = (SimpleTrigger) trigger;
					uniQuartzBean.setTriggerType("SimpleTrigger");
					uniQuartzBean.setRepeatCount(simpleTrigger.getRepeatCount() + 1)
							.setRepeatInterval(simpleTrigger.getRepeatInterval())
							.setTimesTriggered(simpleTrigger.getTimesTriggered());
				}
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return uniQuartzBean;
	}

	/**
	 * 獲取任務資訊
	 * @param uqb
	 * @return
	 */
	@Override
	public UniQuartzBean getJob(UniQuartzBean uqb) {
		return getJob(uqb.getJobName(), uqb.getJobGroupName());
	}

	/**
	 * 獲取任務資訊
	 * @param jobName
	 * @param jobGroupName
	 * @return
	 */
	@Override
	public UniQuartzBean getJob(String jobName, String jobGroupName) {
		UniQuartzBean uniQuartzBean = null;
		try {
			TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);
			Trigger trigger = quartzScheduler.getTrigger(triggerKey);
			if (!ObjectUtils.isEmpty(trigger)) {
				JobKey jobKey = trigger.getJobKey();
				uniQuartzBean = getJob(jobKey, trigger);
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return uniQuartzBean;
	}

	/**
	 * 獲取所有的任務,指那些新增到quartz排程器中的任務
	 * @return
	 */
	@Override
	public List<UniQuartzBean> getAllJob() {
		List<UniQuartzBean> listUniQuartzBean = new ArrayList<>();
		try {
			GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
			Set<JobKey> jobKeys = quartzScheduler.getJobKeys(matcher);
			if (!CollectionUtils.isEmpty(jobKeys)) {
				jobKeys.forEach(jobKey -> {
					try {
						List<? extends Trigger> listTrigger = quartzScheduler.getTriggersOfJob(jobKey);
						if (!CollectionUtils.isEmpty(listTrigger)) {
							listTrigger.forEach(trigger->{
								UniQuartzBean uniQuartzBean = getJob(jobKey, trigger);
								if (!ObjectUtils.isEmpty(uniQuartzBean)) {
									listUniQuartzBean.add(uniQuartzBean);
								}
							});
						}
					} catch (SchedulerException e) {
						e.printStackTrace();
					}
				});
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return listUniQuartzBean;
	}
	
	/**
	 * 獲取所有任務中-正在執行的例項
	 * 
	 * @return
	 */
	@Override
	public List<UniQuartzBean> getAllJobInstance() {
		List<UniQuartzBean> listUniQuartzBean = new ArrayList<>();
		try {
			List<JobExecutionContext> listExecJob = quartzScheduler.getCurrentlyExecutingJobs();
			if (!CollectionUtils.isEmpty(listExecJob)) {
				listExecJob.forEach(execJob->{
					JobKey jobKey = execJob.getJobDetail().getKey();
					try {
						List<? extends Trigger> listTrigger = quartzScheduler.getTriggersOfJob(jobKey);
						if (!CollectionUtils.isEmpty(listTrigger)) {
							listTrigger.forEach(trigger->{
								//UniQuartzBean uniQuartzBean = getJob(jobKey, trigger);
								UniQuartzBean uniQuartzBean = getRuningJob(execJob, trigger);
								if (!ObjectUtils.isEmpty(uniQuartzBean)) {
									listUniQuartzBean.add(uniQuartzBean);									
								}
							});
						}
					} catch (SchedulerException e) {
						e.printStackTrace();
					}
				});
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return listUniQuartzBean;
	}
	
	/**
	 * 獲取正在執行的任務資訊
	 * @param execJob
	 * @param trigger
	 * @return
	 */
	private UniQuartzBean getRuningJob(JobExecutionContext execJob, Trigger trigger) {
		UniQuartzBean uniQuartzBean = null;
		try {
			JobKey jobKey = trigger.getJobKey();
			String jobName = jobKey.getName();
			String jobGroupName = jobKey.getGroup();
			if (!ObjectUtils.isEmpty(trigger)) {
				uniQuartzBean = new UniQuartzBean();
				// 獲取任務基本資訊,作業名稱、作業組名稱、觸發器名稱、觸發器組名稱
				uniQuartzBean.setJobName(jobName).setJobGroupName(jobGroupName).setTriggerName(jobName)
						.setTriggerGroupName(jobGroupName);
				JobDetail jobDetail = quartzScheduler.getJobDetail(jobKey);
				// 獲取作業“實際”開始的時間、上次執行的時間、下次執行的時間
				uniQuartzBean.setStartTime(execJob.getFireTime()).setPreviousTime(execJob.getPreviousFireTime())
						.setNextTime(execJob.getNextFireTime());
				// 獲取作業狀態
				uniQuartzBean.setJobClass("" + jobDetail.getJobClass()).setDescription(trigger.getDescription());
				// 獲取執行時間、例項ID
				uniQuartzBean.setJobRunTime(execJob.getJobRunTime()).setJobId(execJob.getFireInstanceId());
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		return uniQuartzBean;
	}
}

測試:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath*:/spring-context*.xml", "classpath*:/quartz_jobs.xml" })
public class UniQuartz2Test {
	@Autowired
	UniQuartz uniQuartz2;
	
	@Test
	public void testAddJob_TimedTask() throws InterruptedException {
		System.out.println("--------新增定時器------start---------");
		UniQuartzConfig uqc =UniQuartzConfig.newInstance().setCron("0/3 * * * * ?");
		UniQuartzBean uqb = new UniQuartzBean("jobName2", "jobGroupName1");
		uniQuartz2.addJob(uqb, uqc, TimedTaskJob.class, "每隔3秒執行一次.");
		uqb.setDescription("定時器");
		System.out.println("--------新增定時器------stop---------");
		int i= 0;
		while (true) {
			i++;
			Thread.sleep(1000);
			if (i >= 16)
				break;
		}
	}
}

參考部落格:

相關推薦

spring quartz實現定時任務任務動態

配置見前面兩篇部落格 首先我需要的quartz相關的資訊包括任務名稱、任務組名稱、作業開始時間、作業結束時間等,定義一個類UniQuartzBean用於儲存這些屬性: import java.util.Date; public class UniQuartzBean {

Spring+Quartz實現定時任務的配置方法

detail 包含 範例 empty beans ref tail 可選 creat 1、Scheduler的配置 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&g

Spring+quartz實現定時任務叢集

1.準備環境(以maven為例,如果不是請自行下載需要的jar包) <!-- quartz定時排程器 --> <dependency> <groupId>org.quartz-scheduler&l

Spring+Quartz實現定時任務

DEBUG 2018-01-19 15:56:45,822 org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor: Could not find default TaskScheduler bean org

Linux系統定時任務任務

一.延時任務: 1.at    命令 at  命令可以指定某一任務在將來的特定時間執行。 at  時間     延時任務 ctrl+d     &n

Linux系統定時任務任務 20181104

一、系統延時任務 使用at 命令發起的延時任務都是一次性的 基本用法: 1. at   time   #指定命令執行的時間 2. at   -l   #檢視當前任務   

Linux 系統定時任務任務

一,延遲任務 ctrl+d 發起任務 新建檔案用來測試,發起監控 [[email protected] ~]# mkdir /test [[email protected] ~]# touch /test/test{1..6} [[emai

系統定時任務任務

一、延遲任務 這裡使用at命令: at now+1min ##從現在起過1分鐘 at 09:10 ##指定09:10執行任務 回車後輸入任務命令 ctrl+d 任務發起 然後 at -l 加任務號 ###檢視任

運維學習 unit 16 定時任務任務

一.延時任務命令at 1 at命令兩種開啟方式 1)at +時間 編輯命令, 以touch /mnt/test 為例 2)at now+1min 檢視延遲任務at -l 檢視任務內容、 at -c +任務號 刪除延時任務 at -r +任務號 2 a

【iOS沉思錄】iOS中如何觸發定時任務任務

iOS中如何觸發定時任務或延時任務? 定時任務指的是週期性的呼叫某個方法,實現任務的反覆執行,例如倒計時功能的實現;延時任務指的是等待一定時間後再執行某個任務,例如頁面的延時跳轉等。iOS中控制任務的延時或定時執行的方法有很多,使用中要注意是同步還是非同步,是

ScheduledThreadPoolExecutor實現定時器和載入功能

java.util.concurrent.ScheduledThreadPoolExecutor 是 JDK1 .6之後自帶的 包,功能強大,能實現定時器和延時載入的功能 各類功能和處理方面優於Timer 1、定時器: ScheduledThreadPoolExecut

系統任務任務

延時任務 at命令 [[email protected]~]# at 23:25 任務發起時間 at>rm -fr /mnt/* 任務動作 at> 用ctrl+D發起任務 job 3 at Mon Nov 5 23:25:00 2018 [[email 

mybatis的傳統的實現

3.2.1、儲存使用者 <insert id="saveUser" parameterType="com.atguigu.mybatis.pojo.User"> insert into t_user(`last_name`,`sex`) valu

Mapper介面方式的mybatis的實現

4.1、Mapper介面程式設計的命名習慣Mapper介面方式的程式設計,需要先有一個介面。這個介面的命名一般是xxxxMapper。 比如: User模組的Mapper,介面命名為UserMapper。 Book模組的Mapper,介面命名為BookMappe

shell指令碼操作mysql資料庫,使用mysql的-e引數可以執行各種sql的(建立,刪除,)等各種操作

來源:http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520114116289991/ mysql  -hhostname -Pport -uusername -ppassword  -e  相關mysql的

Spring整合quartz實現定時動態任務

comm 通過 app 定時器 表示 時間 con 任務 images 在Spring中使用Quartz有兩種方式實現:第一種是任務類繼承QuartzJobBean,第二種則是在配置文件裏定義任務類和要執行的方法,類和方法可以是普通類。很顯然,第二種方式遠比第一種方式來的靈

運維學習之系統任務定時任務以及臨時文件的管理

linux系統的延時及定時任務1.延時任務at 命令 發起的任務都是一次性的at +time下圖表示在21:22分進行刪除命令命令ctrl+d 表示發起動作at -l | atq #查看當前任務at -d | atrm #取消指定任務at -c #查看任務內容由圖二知主要執行touch這條命令at n

系統的任務定時任務以及清理臨時檔案

1.系統延時任務 例如: watch -n 1 ls /mnt 監控/mnt的內容,時間間隔為1s touch /mnt/file{1..10} 在/mnt中建立file1-file10 at 09:24 設定任務執行時間 rm -fr /mnt/*

Spring配置Quartz實現定時排程任務

一 Quartz 一個開源的作業排程框架,配置執行定時任務 二 配置 1 依賴 <dependency>     <groupId>org.quartz-scheduler</groupId>     <artifactId>

Spring+Quartz實現動態新增定時任務(一)

在最近工作中,由於涉及到定時任務特別多,而這些工作又是由下屬去完成的,在生成環境中經常會出現業務邏輯錯誤,分析下來多數是定時任務執行問題,所以就希望把定時任務優化一下,主要實現2個方面1.定時任務動態配置及持久化2.視覺化的管理介面,可以非常清晰的管理自己的所有定時任務首先,