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