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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • openssl 签发证书_keytool生成证书

    openssl 签发证书_keytool生成证书第一步Openssl产生私钥RSA第二步生成公钥第三步创建证书签名请求CSR文件第四步生成证书其它第一步:Openssl产生私钥(RSA)//1、生成私钥$opensslgenrsa-aes128-outfd.key2048GeneratingRSAprivatekey,2048bitlongmodulus….+++……

    2022年9月18日
    3
  • 分析开源项目[通俗易懂]

    分析开源项目[通俗易懂]手把手教你分析开源项目不知道代码怎么来的?代码跑不起来?项目对自己有帮助,不会模块化分析?任何一个开源项目,都可以让自己得到提升!这里以EL-ADMIN为例https://el-admin.vip/1、观察开源项目后端代码:前端代码:2、开源项目下载可使用zip下载,或者Git观察:用了哪些技术(springboot,vue,redis,)是否有数据库(mysql)你的环境是否匹配(Java,Maven,npm,nodejs,)通过了,然后再想办法运行3、跑

    2022年6月11日
    41
  • findindex方法_find函数怎么用

    findindex方法_find函数怎么用findIndex(fn)方法:(注意:1.不需要return2.参数fn就是检索条件)返回在数组中查找符合条件第一个元素的index索引。vararr=[12,16,18,20]letindex=arr.findindex((item)=>{ item>=18})//打印index为2…

    2025年6月25日
    5
  • 软件测试入门基础_软件测试如何自学

    软件测试入门基础_软件测试如何自学电商项目实战-用例设计系列参考书籍:《电商后台系统产品逻辑全解析》一、电商模式其中大家接触最多的就是B2C。电商模式名词解释不做过多讲解。电商模式二:电商后台管理系统。重点给大家分享订单中心、支付中心、促销中心的用例设计思路。电商后台管理系统【1】促销形式…………

    2022年9月25日
    1
  • idea 查看jsp是否被引用_idea 运行JSP后显示源代码是什么情况

    idea 查看jsp是否被引用_idea 运行JSP后显示源代码是什么情况该楼层疑似违规已被系统折叠隐藏此楼查看此楼没加struts的jar包时可以用,加上jar包后就不能用了。tomcat好像有一个报错信息”C:\ProgramFiles\Java\apache-tomcat-7.0.54\bin\catalina.bat”run[2014-09-1909:05:12,773]Artifactdemo:warexploded:Serverisnot…

    2022年10月21日
    2
  • SilverlightQQ体验报告…

    SilverlightQQ体验报告…显示风格…太华丽了..风格2MacOS的滑动效果..太暴力了 另外一种显示风格.. 嘛是起飞??? 好友搜索 

    2022年7月17日
    18

发表回复

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

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