1.添加pom.xml

<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.</version>
</dependency>

2.添加配置文件,或者不添加使用默认也行,默认线程池数量为10

打开quartz的jar包,可以找到该配置  quartz.properties

复制到资源目录下修改如下

org.quartz.scheduler.instanceName: DemoQuartz
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
#线程池数量
org.quartz.threadPool.threadCount:
org.quartz.threadPool.threadPriority:
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true org.quartz.jobStore.misfireThreshold: org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

3.编写job
DemoJob.class,HelloJob.class
实现接口 org.quartz.Job

package com.yun.base.job;

import java.util.Calendar;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class HelloJob implements Job { private static final Logger LOGGER = LoggerFactory.getLogger(HelloJob.class); @Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
try {
LOGGER.info(context.getScheduler().getSchedulerName());
String jobParam = (String) context.getJobDetail().getJobDataMap().get("jobParam");
if (jobParam != null) {
LOGGER.info(jobParam.toString());
}
LOGGER.info(Integer.toString(Calendar.getInstance().get(Calendar.SECOND)));
} catch (SchedulerException e) {
e.printStackTrace();
}
} }

4.编写任务管理工具类 JobSchedule

package com.yun.util;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class JobSchedule { private static final Logger LOGGER = LoggerFactory.getLogger(JobSchedule.class); private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
private static String JOB_GROUP_NAME = "YUN_JOBGROUP_NAME";
private static String TRIGGER_GROUP_NAME = "YUN_TRIGGERGROUP_NAME"; private JobSchedule(){ } /**
* @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
*
* @param jobName
* 任务名
* @param cls
* 任务
* @param cron
* 时间设置,参考quartz说明文档
* @throws SchedulerException
*
*/
public static void addJob(String jobName, Class cls, String cron)
throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler(); // 用于描叙Job实现类及其他的一些静态信息,构建一个作业实例
JobDetail jobDetail = JobBuilder.newJob(cls)
.withIdentity(jobName, JOB_GROUP_NAME).build(); // 构建一个触发器,规定触发的规则
Trigger trigger = TriggerBuilder.newTrigger()// 创建一个新的TriggerBuilder来规范一个触发器
.withIdentity(jobName, TRIGGER_GROUP_NAME)// 给触发器起一个名字和组名
.startNow()// 立即执行
.withSchedule(CronScheduleBuilder.cronSchedule(cron)) // 触发器的执行时间
.build();// 产生触发器 sched.scheduleJob(jobDetail, trigger);
LOGGER.debug("添加任务:{},{},{}",jobName,cls,cron);
// 启动
if (!sched.isShutdown()) {
sched.start();
}
} /**
* @Description: 添加一个定时任务
*
* @param jobName
* 任务名
* @param jobGroupName
* 任务组名
* @param triggerName
* 触发器名
* @param triggerGroupName
* 触发器组名
* @param jobClass
* 任务
* @param cron
* 时间设置,参考quartz说明文档
*/
public static void addJob(String jobName, String jobGroupName,
String triggerName, String triggerGroupName, Class cls, String cron)
throws SchedulerException { Scheduler sched = gSchedulerFactory.getScheduler();
// 用于描叙Job实现类及其他的一些静态信息,构建一个作业实例
JobDetail jobDetail = JobBuilder.newJob(cls)
.withIdentity(jobName, jobGroupName).build(); // 构建一个触发器,规定触发的规则
Trigger trigger = TriggerBuilder.newTrigger()// 创建一个新的TriggerBuilder来规范一个触发器
.withIdentity(jobName, triggerGroupName)// 给触发器起一个名字和组名
.startNow()// 立即执行
.withSchedule(CronScheduleBuilder.cronSchedule(cron)) // 触发器的执行时间
.build();// 产生触发器 sched.scheduleJob(jobDetail, trigger);
LOGGER.debug("添加任务:{},{},{},{},{},{}",jobName,jobGroupName,triggerName,triggerGroupName,cls,cron);
// 启动
if (!sched.isShutdown()) {
sched.start();
} } /**
* @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobName
* @param cron
* @throws SchedulerException
*
*/
public static void modifyJobTime(String jobName, String cron) throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);
CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);
if (trigger == null) {
return;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(cron)) {
JobDetail jobDetail = sched.getJobDetail(new JobKey(jobName,
JOB_GROUP_NAME));
Class objJobClass = jobDetail.getJobClass();
removeJob(jobName);
addJob(jobName, objJobClass, cron);
LOGGER.debug("修改任务:{},{}",jobName,cron);
}
} /**
* @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobName
*
* @throws SchedulerException
*/
public static void removeJob(String jobName) throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = new JobKey(jobName, TRIGGER_GROUP_NAME);
// 停止触发器
sched.pauseJob(jobKey);
sched.unscheduleJob(new TriggerKey(jobName, TRIGGER_GROUP_NAME));// 移除触发器
sched.deleteJob(jobKey);// 删除任务
LOGGER.debug("移除任务:{}",jobName);
} /**
* 移除任务
*
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
* @throws SchedulerException
*/
public static void removeJob(String jobName, String jobGroupName,
String triggerName, String triggerGroupName)
throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler();
JobKey jobKey = new JobKey(jobName, jobGroupName);
// 停止触发器
sched.pauseJob(jobKey);
sched.unscheduleJob(new TriggerKey(jobName, triggerGroupName));// 移除触发器
sched.deleteJob(jobKey);// 删除任务
LOGGER.debug("移除任务:{},{},{},{},{},{}",jobName,jobGroupName,triggerName,triggerGroupName);
} /**
* 启动所有任务
*
* @throws SchedulerException
*/
public static void startJobs() throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler();
sched.start();
LOGGER.debug("启动所有任务");
} /**
* 关闭所有定时任务
*
* @throws SchedulerException
*
*/
public static void shutdownJobs() throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler();
if (!sched.isShutdown()) {
sched.shutdown();
LOGGER.debug("关闭所有任务");
}
} }

5.测试

  @Test
public void testTask() {
try {
String job_name = "动态任务调度";
System.out.println("【系统启动】开始(每1秒输出一次)...");
JobSchedule.addJob(job_name, DemoJob.class, "0/1 * * * * ?"); Thread.sleep();
System.out.println("【修改时间】开始(每2秒输出一次)...");
JobSchedule.modifyJobTime(job_name, "10/2 * * * * ?");
Thread.sleep();
System.out.println("【移除定时】开始...");
JobSchedule.removeJob(job_name);
System.out.println("【移除定时】成功"); System.out.println("【再次添加定时任务】开始(每10秒输出一次)...");
JobSchedule.addJob(job_name, HelloJob.class, "*/10 * * * * ?");
Thread.sleep();
System.out.println("【移除定时】开始...");
JobSchedule.removeJob(job_name);
System.out.println("【移除定时】成功");
} catch (Exception e) {
e.printStackTrace();
}
}

测试结果

【系统启动】开始(每1秒输出一次)...
-- ::03.026 [main] DEBUG com.yun.util.JobSchedule - 添加任务:动态任务调度,class com.yun.base.job.DemoJob,/ * * * * ?
-- ::03.042 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob - DemoQuartz
-- ::03.042 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob -
-- ::04.001 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob - DemoQuartz
-- ::04.001 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob -
-- ::05.004 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob - DemoQuartz
-- ::05.004 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob -
-- ::06.008 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob - DemoQuartz
-- ::06.008 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob -
-- ::07.012 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob - DemoQuartz
-- ::07.012 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob -
-- ::08.012 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob - DemoQuartz
-- ::08.013 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob -
【修改时间】开始(每2秒输出一次)...
-- ::08.043 [main] DEBUG com.yun.util.JobSchedule - 移除任务:动态任务调度
-- ::08.047 [main] DEBUG com.yun.util.JobSchedule - 添加任务:动态任务调度,class com.yun.base.job.DemoJob,/ * * * * ?
-- ::08.047 [main] DEBUG com.yun.util.JobSchedule - 修改任务:动态任务调度,/ * * * * ?
-- ::10.001 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob - DemoQuartz
-- ::10.001 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob -
-- ::12.013 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob - DemoQuartz
-- ::12.013 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob -
-- ::14.005 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob - DemoQuartz
-- ::14.005 [DemoQuartz_Worker-] INFO com.yun.base.job.DemoJob -
【移除定时】开始...
-- ::14.054 [main] DEBUG com.yun.util.JobSchedule - 移除任务:动态任务调度
【移除定时】成功
【再次添加定时任务】开始(每10秒输出一次)...
-- ::14.054 [main] DEBUG com.yun.util.JobSchedule - 添加任务:动态任务调度,class com.yun.base.job.HelloJob,*/ * * * * ?
-- ::20.010 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob - DemoQuartz
-- ::20.010 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob -
-- ::30.006 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob - DemoQuartz
-- ::30.006 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob -
-- ::40.004 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob - DemoQuartz
-- ::40.005 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob -
-- ::50.007 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob - DemoQuartz
-- ::50.007 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob -
-- ::00.010 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob - DemoQuartz
-- ::00.010 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob -
-- ::10.000 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob - DemoQuartz
-- ::10.000 [DemoQuartz_Worker-] INFO com.yun.base.job.HelloJob -
【移除定时】开始...
-- ::14.060 [main] DEBUG com.yun.util.JobSchedule - 移除任务:动态任务调度
【移除定时】成功

org.quartz-scheduler 动态添加自动任务的更多相关文章

  1. quartz.net动态添加job

    quartz.net动态添加job设计-(五) 介绍 在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布. 也看到有园子的同学问过.这里就介绍下实现 ...

  2. Net作业调度(五)—quartz.net动态添加job设计

    介绍 在实际项目使用中quartz.net中,都希望有一个管理界面可以动态添加job,而避免每次都要上线发布. 也看到有园子的同学问过.这里就介绍下实现动态添加job的几种方式, 也是二次开发的核心模 ...

  3. Spring+Quartz实现动态添加定时任务

    发布时间:2018-12-03   技术:spring4.0.2+quartz2.2.1   概述 在最近工作中,由于涉及到定时任务特别多,而这些工作又是由下属去完成的,在生成环境中经常会出现业务逻辑 ...

  4. 动态添加定时任务-quartz定时器

    Quartz动态添加.修改和删除定时任务 在项目中有一个需求,需要灵活配置调度任务时间,刚开始用的Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务 ...

  5. Quartz动态添加定时任务执行sql(服务启动添加+手动添加)

    系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...

  6. Quartz动态添加,修改,删除任务(暂停,任务状态,恢复,最近触发时间)

    首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat 写博客 小程序 消息 登录注册 关闭 quartz_Cron表达式一分钟教程 09-05 ...

  7. 任务调度开源框架Quartz动态添加、修改和删除定时任务

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触发器监听.你可以配置作业和触发器监听为全局监听或者是特定于 ...

  8. Quartz动态添加、修改和删除定时任务

    任务调度开源框架Quartz动态添加.修改和删除定时任务 Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.Quartz框架包含了调度器监听.作业和触 ...

  9. Quartz 2.2 动态添加、修改和删除定时任务

    QuartzManager.Java 动态添加.修改和删除定时任务管理类 import org.quartz.CronScheduleBuilder; import org.quartz.CronTr ...

随机推荐

  1. 架构探险笔记4-使框架具备AOP特性(上)

    对方法进行性能监控,在方法调用时统计出方法执行时间. 原始做法:在内个方法的开头获取系统时间,然后在方法的结尾获取时间,最后把前后台两次分别获取的系统时间做一个减法,即可获取方法执行所消耗的总时间. ...

  2. 微信小程序页面内转发 按钮 转发

    通过给 button 组件设置属性 open-type="share",可以在用户点击按钮后触发 Page.onShareAppMessage() 事件,如果当前页面没有定义此事件 ...

  3. apiCloud 三方分享,微信好友分享,微信朋友圈分享,QQ分享,微博分享

    首先查看我的这篇有关三方登录的博客,地址是http://www.cnblogs.com/gqx-html/p/8303567.html,配置完三方数据后可以从上一篇文章中的链接跳转到各个登录查看api ...

  4. Linux中磁盘mbr分区——实践篇

    Linux中磁盘mbr分区——实践篇 fdisk命令 语法 fdisk(选项)(参数) 选项 -b <分区大小> 指定每个分区的大小 -l 列出分区表信息 -v 显示版本信息 参数 设备文 ...

  5. 【JS】【1】JavaScript屏蔽Backspace键(避免点击后页面产生回退)

    前言: 1,参考资料:JavaScript屏蔽Backspace键 - 孤傲苍狼 - 博客园(http://www.cnblogs.com/xdp-gacl/p/3785806.html) 2,参考的 ...

  6. ACM基础(一)

    比较大的数组应尽量声明在main函数外,否则程序可能无法运行. C语言的数组并不是“一等公民”,而是“受歧视”的.例如,数组不能够进行赋值操作: 在程序3-1中,如果声明的是“int a[maxn], ...

  7. SAP 打开SAP物料帐期和财务账期

    引http://blog.sina.com.cn/s/blog_494f9a6b0102e8zw.html 物料账期:Tcode MMPV和Tcode MMRV 财务账期:Tcode OKP1  和O ...

  8. 15. 3Sum C++

    参考资料: https://leetcode.com/problems/3sum/discuss/7402/Share-my-AC-C%2B%2B-solution-around-50ms-O(N*N ...

  9. Eclipse直接打开类文件/文件夹所在的本地目录

    1.Eclipse原生的文件浏览操作 选择项目目录/文件 按 ALT+SHIFT +W , 会弹出菜单点击 System Explorer 就可以打开文件所在的本地目录了: 设置工具目录 Run -- ...

  10. JavaScript基础(四)

    十六.client.offset.scroll系列 1.client系列 代码如下: <!DOCTYPE html> <html> <head> <meta ...