1.添加pom.xml

<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</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: 1
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true org.quartz.jobStore.misfireThreshold: 60000 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(5000);
System.out.println("【修改时间】开始(每2秒输出一次)...");
JobSchedule.modifyJobTime(job_name, "10/2 * * * * ?");
Thread.sleep(6000);
System.out.println("【移除定时】开始...");
JobSchedule.removeJob(job_name);
System.out.println("【移除定时】成功"); System.out.println("【再次添加定时任务】开始(每10秒输出一次)...");
JobSchedule.addJob(job_name, HelloJob.class, "*/10 * * * * ?");
Thread.sleep(60000);
System.out.println("【移除定时】开始...");
JobSchedule.removeJob(job_name);
System.out.println("【移除定时】成功");
} catch (Exception e) {
e.printStackTrace();
}
}

  

测试结果

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

  

文章转载至:https://www.cnblogs.com/yun965861480/p/7211327.html?utm_source=itdadao&utm_medium=referral

 

Quartz:Quartz定时代码实现的更多相关文章

  1. C#使用quartz.net定时问题

    因工作需要需要完成定时查询数据..因此在了解之后完成了一个demo 所需要的dll在该地址下载 http://pan.baidu.com/s/1sjNQLXV 首先引入quartz这个dll... 在 ...

  2. 用abp vNext快速开发Quartz.NET定时任务管理界面

    今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp.net core的快速开发框架来进行Quartz.net定时任务调度的管理界面的开发.大伙最好跟着一起敲一下代码,当然源码 ...

  3. spring和Quartz的定时功能

    一:前沿 最近在做一个定时的功能,就是在一定时间内查询订单,然后告诉用户未付款,已付款等消息通知,而且要做集群的功能,这个集群的功能是指,我部署两套代码,其中一个定时的功能在运行,另外一个就不要运行. ...

  4. Hosted Services+Quartz实现定时任务调度

    背景 之前.net core使用quartz.net时,总感觉非常变扭,百度和谷歌了N久都没解决以下问题,造成代码丑陋,非常不优雅: 1.项目启动时,要立刻恢复执行quartz.net中的任务 2.q ...

  5. 【10】Quartz.net 定时服务实例

    一.安装nuget包 Install-Package Quartz Install-Package Common.Logging.Log4Net1211 Install-Package log4net ...

  6. spring结合quartz的定时的2种方式

    1. Spring 的org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类,使用此方法使开发人员对Quar ...

  7. 用Quartz处理定时执行的任务

    这次做的项目中,有一部分功能需要实现定时执行.呃,这样说可能有点笼统,打个比方吧.例如用户在登录的时候,连续输错3次密码后,系统会将该用户冻结,不再允许该用户登录系统,等到了晚上零晨时分,再为所有被冻 ...

  8. Quartz.net 定时任务在IIS中未按时执行

    IIS 垃圾回收机制下解决Quartz.net 的不执行问题 IIS中涉及了垃圾回收机制,quartz.net 在ASP.NET 项目中可以实现线程监控定时执行任务,但是在IIS7.5机一下版本中涉及 ...

  9. quartz实现定时功能实例详解(servlet定时器配置方法)

    Quartz是一个完全由java编写的开源作业调度框架,下面提供一个小例子供大家参考,还有在servlet配置的方法 Quartz是一个完全由java编写的开源作业调度框架,具体的介绍可到http:/ ...

随机推荐

  1. 聊聊java工程师换工作那些事

    最近有个读者在苦恼一件事,那就是有大公司在挖他,他要不要从所在的小公司,跳槽到大公司,前提是两家公司的待遇基本一致.由这个问题结合自己多年的工作经验,来谈谈java工程师要不要跳槽,何时跳槽,怎么跳槽 ...

  2. [leetcode] 116. 填充同一层的兄弟节点

    116. 填充同一层的兄弟节点 其实就是个二叉树的层次遍历 class Solution { public void connect(TreeLinkNode root) { if (root == ...

  3. (续篇)Selenium 安装配置以及如何解决('chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/ch)或者(unknown error:cannot find Chrome binary)问题?

    注:本帖针对小小白哦~~(づ ̄3 ̄)づ╭- 接pip安装的帖子,不需要的直接跳过... 首先上图,出现如下的错误,那你可是找到知己了: 或者: 抱歉抱歉,这图截的不太清晰,凑合着用吧,但是也能看出来错 ...

  4. 调试动态加载的js

    用浏览器无法调试异步加载页面里包含的js文件.简单的说就是在调试工具里面看不到异步加载页面里包含的js文件   最近在一个新的web项目中开发功能.这个项目的管理界面有一个特点,框架是固定的,不会刷新 ...

  5. HTML5之WebSocket(转自知乎)

    在认识websocket之前,我们必须了解的是websocket有什么用? 他能解决我们遇到的什么问题? 如果没用,那么我们就么有使用它的必要的. websocket就是建立起全双工协议的,提高了效率 ...

  6. Linux BSP非标准HDMI分辨率

    Linux BSP非标准HDMI分辨率 Intrinsyc公司发布了它的一个新的Linux BSP软件的发布 打开-Q820 开发套件基于Linux内核版本.支持的软件功能包括HDMI输出,可以支持标 ...

  7. Mobileye高级驾驶辅助系统(ADAS)

    Mobileye高级驾驶辅助系统(ADAS) Mobileye is the global leader in the development of vision technology for Adv ...

  8. Technology Document Guide of TensorRT

    Technology Document Guide of TensorRT Abstract 本示例支持指南概述了GitHub和产品包中包含的所有受支持的TensorRT 7.2.1示例.Tensor ...

  9. Python API vs C++ API of TensorRT

    Python API vs C++ API of TensorRT 本质上,C++ API和Python API应该在支持您的需求方面接近相同.pythonapi的主要优点是数据预处理和后处理都很容易 ...

  10. Java设计模式(3:接口隔离原则和迪米特法则详解)

    一.接口隔离原则 使用多个接口,而不使用单一的接口,客户端不应该依赖它不需要的接口.尽量的细化接口的职责,降低类的耦合度. 我们先来看一个例子: 小明家附近新开了一家动物园,里面有老虎.鸟儿.长颈鹿. ...