一、配置Quartz.xml

 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 要调用的工作类 -->
<bean id="jobclass" class="com.sh.test.dingshi"></bean> <!-- 配置方法调用 -->
<bean id="conJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobclass"></property>
<property name="targetMethod" value="say"></property>
<!-- 是否允许同时运行 -->
<property name="concurrent" value="false"></property>
</bean> <!-- 定时重复执行 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="conJob"></property>
<property name="cronExpression" >
<value>0/5 * * ? * * </value><!-- 配置5秒执行一次 -->
</property>
</bean> <!-- 定时任务配置,定时工厂,用于管理配置的所有定时器,保证其在单独的线程上运行 -->
<bean id="quartzfactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="cronTrigger"/><!-- 注册开关,local为上面配置的-->
</list>
</property>
</bean> </beans>

spring-dingshi.xml

二、导入jar

quartz-1.8.5.jar

三、创建冷部署的定时任务类,dingshi.java

 package com.sh.test;

 import java.text.SimpleDateFormat;
import java.util.Date; import org.springframework.stereotype.Service; @Service("dingshi")
public class dingshi {
public void say(){
String format = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(format);
System.out.println("定时循环执行:"+sdf.format(new Date()));
}
}

这配置有两种方式

注解方式:

1.通过在任务类(dingshi.java)中配置注解@Service("dingshi")

2.在配置文件(spring-dingshi.xml)中第18行配置ref="dingshi",无需第14行

非注解方式:

1.在配置文件(spring-dingshi.xml)中配置第14行内容,在第18行ref=“id”配置18行的id

四、配置热部署管理类

 package com.sh.test;

 import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory; /**
* @Description: 定时任务管理类
*
* @ClassName: QuartzManager
* @Copyright: Copyright (c) 2015
*
* @author SH
* @version V2.0
*/
public class QuartzManager {
private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME"; /**
* @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
*
* @param jobName
* 任务名
* @param cls
* 任务
* @param time
* 时间设置,参考quartz说明文档
*
* @Title: QuartzManager.java
* @Copyright: Copyright (c) 2015
*
* @author SH
* @version V2.0
*/
@SuppressWarnings("unchecked")
public static void addJob(String jobName, Class cls, String time) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务执行类
// 触发器
CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组
trigger.setCronExpression(time);// 触发器时间设定
sched.scheduleJob(jobDetail, trigger);
// 启动
if (!sched.isShutdown()) {
sched.start();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* @Description: 添加一个定时任务
*
* @param jobName
* 任务名
* @param jobGroupName
* 任务组名
* @param triggerName
* 触发器名
* @param triggerGroupName
* 触发器组名
* @param jobClass
* 任务
* @param time
* 时间设置,参考quartz说明文档
*
* @Title: QuartzManager.java
* @Copyright: Copyright (c) 2015
*
* @author SH
* @version V2.0
*/
@SuppressWarnings("unchecked")
public static void addJob(String jobName, String jobGroupName,
String triggerName, String triggerGroupName, Class jobClass,
String time) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类
// 触发器
CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组
trigger.setCronExpression(time);// 触发器时间设定
sched.scheduleJob(jobDetail, trigger);
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobName
* @param time
*
* @Title: QuartzManager.java
* @Copyright: Copyright (c) 2015
*
* @author SH
* @version V2.0
*/
@SuppressWarnings("unchecked")
public static void modifyJobTime(String jobName, String time) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);
if (trigger == null) {
return;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(time)) {
JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);
Class objJobClass = jobDetail.getJobClass();
removeJob(jobName);
addJob(jobName, objJobClass, time);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* @Description: 修改一个任务的触发时间
*
* @param triggerName
* @param triggerGroupName
* @param time
*
* @Title: QuartzManager.java
* @Copyright: Copyright (c) 2015
*
* @author SH
* @version V2.0
*/
public static void modifyJobTime(String triggerName,
String triggerGroupName, String time) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);
if (trigger == null) {
return;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(time)) {
CronTrigger ct = (CronTrigger) trigger;
// 修改时间
ct.setCronExpression(time);
// 重启触发器
sched.resumeTrigger(triggerName, triggerGroupName);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobName
*
* @Title: QuartzManager.java
* @Copyright: Copyright (c) 2015
*
* @author SH
* @version V2.0
*/
public static void removeJob(String jobName) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器
sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器
sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* @Description: 移除一个任务
*
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
*
* @Title: QuartzManager.java
* @Copyright: Copyright (c) 2015
*
* @author SH
* @version V2.0
*/
public static void removeJob(String jobName, String jobGroupName,
String triggerName, String triggerGroupName) {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器
sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器
sched.deleteJob(jobName, jobGroupName);// 删除任务
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* @Description:启动所有定时任务
*
*
* @Title: QuartzManager.java
* @Copyright: Copyright (c) 2015
*
* @author SH
* @version V2.0
*/
public static void startJobs() {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
sched.start();
} catch (Exception e) {
throw new RuntimeException(e);
}
} /**
* @Description:关闭所有定时任务
*
*
* @Title: QuartzManager.java
* @Copyright: Copyright (c) 2015
*
* @author SH
* @version V2.0
*/
public static void shutdownJobs() {
try {
Scheduler sched = gSchedulerFactory.getScheduler();
if (!sched.isShutdown()) {
sched.shutdown();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

QuartzManager.java

五、热部署执行类

 package com.sh.test;

 import java.text.SimpleDateFormat;
import java.util.Date; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; /**
* @Description: 任务执行类
*
* @ClassName: QuartzJob
* @Copyright: Copyright (c) 2015
*
* @author SH
* @version V2.0
*/
public class QuartzJob implements Job { public void execute(JobExecutionContext arg0) throws JobExecutionException {
String name = arg0.getTrigger().getName();//获得当前执行任务名
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}

QuartzJob.java

六、热部署测试类

 package com.sh.test;

 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; /**
* @Description: 测试类
*
* @ClassName: QuartzTest
* @Copyright: Copyright (c) 2014
*
* @author SH
* @version V2.0
*/
@Controller
public class QuartzTest {
public static void main(String[] args) {
try {
String job_name = "动态任务调度";
System.out.println("【系统启动】开始(每1秒输出一次)...");
QuartzManager.addJob(job_name, QuartzJob.class, "0/1 * * * * ?"); Thread.sleep(5000);
System.out.println("【修改时间】开始(每2秒输出一次)...");
QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");
Thread.sleep(6000);
System.out.println("【移除定时】开始...");
QuartzManager.removeJob(job_name);
System.out.println("【移除定时】成功"); System.out.println("【再次添加定时任务】开始(每10秒输出一次)...");
QuartzManager.addJob(job_name, QuartzJob.class, "*/10 * * * * ?");
Thread.sleep(60000);
System.out.println("【移除定时】开始...");
QuartzManager.removeJob(job_name);
System.out.println("【移除定时】成功");
} catch (Exception e) {
e.printStackTrace();
}
}
String job_name = "动态任务调度";
@RequestMapping(value="/add",method=RequestMethod.GET)
public void timmertest(HttpServletRequest request,HttpServletResponse response){
System.out.println("【系统启动】开始(每1秒输出一次)...");
QuartzManager.addJob(job_name, QuartzJob.class, "0/1 * * * * ?");
}
@RequestMapping(value="/update",method=RequestMethod.GET)
public void timmertest1(HttpServletRequest request,HttpServletResponse response){
System.out.println("【修改时间】开始(每2秒输出一次)...");
QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");
}
@RequestMapping(value="/del",method=RequestMethod.GET)
public void timmertest2(HttpServletRequest request,HttpServletResponse response){
QuartzManager.removeJob(job_name);
System.out.println("【移除定时】成功");
}
}

QuartzTest.java

最新文章

  1. 计算机系列:CUDA 深入研究
  2. centos7 install 安装mysql
  3. apple mobile device服务无法启动,错误1053 解决
  4. Shiro 整合SpringMVC 并且实现权限管理,登录和注销
  5. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)
  6. VirtualBox中虚拟Ubuntu添加新的虚拟硬盘
  7. insert into select 堵塞update
  8. LaTeX中titlesec宏包的使用
  9. BZOJ 1692: [Usaco2007 Dec]队列变换( 贪心 )
  10. 侯捷STL学习(二)
  11. 关于php的一些安全知识
  12. 7. VIM 系列 - 程序员利器(语法检测、代码块补全、symbol管理、函数跳转)
  13. Java Web 域名
  14. org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException
  15. [No0000CD]shell 中的单行注释和多行注释
  16. MinGW下编译openssl, json-c
  17. Android学习之Fragment解析
  18. centos7-windows10 双系统安装
  19. February 21 2017 Week 8 Tuesday
  20. C++ 学习笔记之 引用

热门文章

  1. mysql 关于字符串搜索的函数
  2. 【死磕 Java 集合】— ConcurrentSkipListMap源码分析
  3. 【2017-04-10】js来控制导航栏在滚动条拉到一定位置时显示
  4. Linux使用storcli工具查看服务器硬盘和raid组信息
  5. da面板修改SSH端口号
  6. 第十五届四川省省赛 SCU - 4443 Range Query
  7. sql 实现取表中相同id时间最大的一行 利用distinct on
  8. 什么是JWT?Token与Session的区别?
  9. ARDUINO UNO烧录BOOTLOADER
  10. QSettings 介绍