quartz定时任务使用(quartz定时任务原理)

packagecom.jeeplus.common.utils;importjava.util.Map;importorg.quartz.CronScheduleBuilder;importorg.quartz.CronTrigger;importorg.quartz.Job;importorg.quartz.JobBuilder;importorg.quartz….

大家好,又见面了,我是你们的朋友全栈君。

package com.jeeplus.common.utils;

import java.util.Map;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;

/**
 * Quartz定时任务util
 * 
 * @author xc
 *
 */
public class QuartzManager {

	private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory(); // 创建一个SchedulerFactory工厂实例
	private static String JOB_GROUP_NAME = "FH_JOBGROUP_NAME"; // 任务组
	private static String TRIGGER_GROUP_NAME = "FH_TRIGGERGROUP_NAME"; // 触发器组

	/**
	 * 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
	 * 
	 * @param jobName
	 *            任务名
	 * @param cls
	 *            任务
	 * @param time
	 *            时间设置,参考quartz说明文档
	 */
	public static void addJob(String jobName, Class<? extends Job> cls, String time) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler(); // 通过SchedulerFactory构建Scheduler对象
			JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, JOB_GROUP_NAME).build(); // 用于描叙Job实现类及其他的一些静态信息,构建一个作业实例
			CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger() // 创建一个新的TriggerBuilder来规范一个触发器
					.withIdentity(jobName, TRIGGER_GROUP_NAME) // 给触发器起一个名字和组名
					.withSchedule(CronScheduleBuilder.cronSchedule(time)).build();
			sched.scheduleJob(jobDetail, trigger);
			if (!sched.isShutdown()) {
				sched.start(); // 启动
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 (带参数)
	 * 
	 * @param jobName
	 *            任务名
	 * @param cls
	 *            任务
	 * @param time
	 *            时间设置,参考quartz说明文档
	 */
	public static void addJob(String jobName, Class<? extends Job> cls, String time, Map<String, Object> parameter) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler(); // 通过SchedulerFactory构建Scheduler对象
			JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, JOB_GROUP_NAME).build(); // 用于描叙Job实现类及其他的一些静态信息,构建一个作业实例
			jobDetail.getJobDataMap().put("parameterList", parameter); // 传参数
			CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger() // 创建一个新的TriggerBuilder来规范一个触发器
					.withIdentity(jobName, TRIGGER_GROUP_NAME) // 给触发器起一个名字和组名
					.withSchedule(CronScheduleBuilder.cronSchedule(time)).build();
			sched.scheduleJob(jobDetail, trigger);
			if (!sched.isShutdown()) {
				sched.start(); // 启动
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 添加一个定时任务
	 * 
	 * @param jobName
	 *            任务名
	 * @param jobGroupName
	 *            任务组名
	 * @param triggerName
	 *            触发器名
	 * @param triggerGroupName
	 *            触发器组名
	 * @param jobClass
	 *            任务
	 * @param time
	 *            时间设置,参考quartz说明文档
	 */
	public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName,
			Class<? extends Job> jobClass, String time) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();// 任务名,任务组,任务执行类
			CronTrigger trigger = (CronTrigger) TriggerBuilder // 触发器
					.newTrigger().withIdentity(triggerName, triggerGroupName)
					.withSchedule(CronScheduleBuilder.cronSchedule(time)).build();
			sched.scheduleJob(jobDetail, trigger);
			if (!sched.isShutdown()) {
				sched.start(); // 启动
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 添加一个定时任务 (带参数)
	 * 
	 * @param jobName
	 *            任务名
	 * @param jobGroupName
	 *            任务组名
	 * @param triggerName
	 *            触发器名
	 * @param triggerGroupName
	 *            触发器组名
	 * @param jobClass
	 *            任务
	 * @param time
	 *            时间设置,参考quartz说明文档
	 */
	public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName,
			Class<? extends Job> jobClass, String time, Map<String, Object> parameter) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			JobDetail jobDetail = JobBuilder.newJob((Class<? extends Job>) jobClass).withIdentity(jobName, jobGroupName)
					.build();// 任务名,任务组,任务执行类
			jobDetail.getJobDataMap().put("parameterList", parameter); // 传参数
			CronTrigger trigger = (CronTrigger) TriggerBuilder // 触发器
					.newTrigger().withIdentity(triggerName, triggerGroupName)
					.withSchedule(CronScheduleBuilder.cronSchedule(time)).build();
			sched.scheduleJob(jobDetail, trigger);
			if (!sched.isShutdown()) {
				sched.start(); // 启动
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
	 * 
	 * @param jobName
	 *            任务名
	 * @param time
	 *            新的时间设置
	 */
	public static void modifyJobTime(String jobName, String time) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler(); // 通过SchedulerFactory构建Scheduler对象
			TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME); // 通过触发器名和组名获取TriggerKey
			CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); // 通过TriggerKey获取CronTrigger
			if (trigger == null) {
				return;
			}
			String oldTime = trigger.getCronExpression();
			if (!oldTime.equalsIgnoreCase(time)) {
				JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); // 通过任务名和组名获取JobKey
				JobDetail jobDetail = sched.getJobDetail(jobKey);
				Class<? extends Job> objJobClass = jobDetail.getJobClass();
				removeJob(jobName);
				addJob(jobName, objJobClass, time);
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 修改一个任务的触发时间
	 * 
	 * @param triggerName
	 *            任务名称
	 * @param triggerGroupName
	 *            传过来的任务名称
	 * @param time
	 *            更新后的时间规则
	 */
	public static void modifyJobTime(String triggerName, String triggerGroupName, String time) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler(); // 通过SchedulerFactory构建Scheduler对象
			TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); // 通过触发器名和组名获取TriggerKey
			CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey); // 通过TriggerKey获取CronTrigger
			if (trigger == null)
				return;
			CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(trigger.getCronExpression());
			String oldTime = trigger.getCronExpression();
			if (!oldTime.equalsIgnoreCase(time)) {
				trigger = (CronTrigger) trigger.getTriggerBuilder() // 重新构建trigger
						.withIdentity(triggerKey).withSchedule(scheduleBuilder)
						.withSchedule(CronScheduleBuilder.cronSchedule(time)).build();
				sched.rescheduleJob(triggerKey, trigger); // 按新的trigger重新设置job执行
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
	 * 
	 * @param jobName
	 *            任务名称
	 */
	public static void removeJob(String jobName) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME); // 通过触发器名和组名获取TriggerKey
			JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME); // 通过任务名和组名获取JobKey
			sched.pauseTrigger(triggerKey); // 停止触发器
			sched.unscheduleJob(triggerKey);// 移除触发器
			sched.deleteJob(jobKey); // 删除任务
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 移除一个任务
	 * 
	 * @param jobName
	 *            任务名
	 * @param jobGroupName
	 *            任务组名
	 * @param triggerName
	 *            触发器名
	 * @param triggerGroupName
	 *            触发器组名
	 */
	public static void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); // 通过触发器名和组名获取TriggerKey
			JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); // 通过任务名和组名获取JobKey
			sched.pauseTrigger(triggerKey); // 停止触发器
			sched.unscheduleJob(triggerKey);// 移除触发器
			sched.deleteJob(jobKey); // 删除任务
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 启动所有定时任务
	 */
	public static void startJobs() {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			sched.start();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 关闭所有定时任务
	 */
	public static void shutdownJobs() {
		try {
			Scheduler sched = gSchedulerFactory.getScheduler();
			if (!sched.isShutdown()) {
				sched.shutdown();
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126431.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月17日 下午7:40
下一篇 2022年4月17日 下午7:40


相关推荐

  • kali扫描工具_nmap批量扫描

    kali扫描工具_nmap批量扫描本片介绍的是Namp的LinuxKali操作系统下的使用,Nmap在Windows操作系统下的使用,点击文章===>https://blog.csdn.net/qq_41453285/article/details/98596828一、工具介绍功能概述:Nmap是主动扫描工具,用于对指定的主机进行扫描 历史背景:Nmap是由GordonLyon设计并实现的,与1997开始发布,最…

    2026年4月15日
    7
  • spring cloud 配置中心配置哪些东西_druid连接池配置优化

    spring cloud 配置中心配置哪些东西_druid连接池配置优化访问http://localhost:8761/访问http://localhost:8761/访问http://localhost:8889/writer

    2025年7月7日
    5
  • ROC曲线的含义以及画法

    ROC曲线的含义以及画法**ROC的含义及画法**ROC的全名叫做ReceiverOperatingCharacteristic(受试者工作特征曲线),又称为感受性曲线(sensitivitycurve)。得此名的原因在于曲线上各点反映着相同的感受性,它们都是对同一信号刺激的反应,只不过是在几种不同的判定标准下所得的结果而已。其主要分析工具是一个画在二维平面上的曲线——ROC曲线。ROC曲线以真正例率TPR为纵轴,以假正例率FPR为横轴,在不同的阈值下获得坐标点,并连接各个坐标点,得到ROC曲线。对于一个分类任务

    2022年5月16日
    33
  • 拉屎抽烟定理_为什么抽烟才能拉出屎

    拉屎抽烟定理_为什么抽烟才能拉出屎最近一直在做游戏,刚开始接触游戏,思维还是撞不过来,买了一本书看了看了一下,才开始有了游戏思维,每当写程序感到思维混乱的时候,于是出去抽根烟,什么烦恼随着眼圈飘忽而出,有时抽着抽着突然就有了灵感,于是

    2022年8月3日
    9
  • android sdk platform-tools_android eclipse安装教程

    android sdk platform-tools_android eclipse安装教程 有用的链接(有些需要AndroidNDK) 一、游戏库、开发库 1. ONScripteronAnroidのページhttp://onscripter.sourceforge.jp/android/android.html(注:提供的SDK包的源码不全,需要加上原来ONScripter的源码才行——属于jni/application/Android.mk…

    2022年8月30日
    3
  • mysql自定义函数详解_mysql自定义函数详解

    mysql自定义函数详解_mysql自定义函数详解需求:对于数据库中的记录,如果有两条连续的数据的value字段的值相同,则发邮件通知相关人员。需求分析:告警系统里面的告警检查是通过SQL来进行的,一般的SQL实现不了此功能,因此,这里可以通过函数的方式来实现。具体实现如下:1、数据表准备:tb_config_record。新建数据表脚本如下:createtabletb_config_record(idint,statusvarch…

    2025年10月3日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号