今天在网上看到一篇文章,对spring定时器进行动态的增,删,改。很有启发,自己动手封装了一下,有些代码是copy那篇文章的,我不知道那篇文章最原始的地址了,无法在此贴出来,先声明一下。
我很少些博文,估计写得不好。
大概意思就是利用spring对quartz的封装实现动态添加定时任务,无需在配置文件中配置定时器。这个在具体系统中还是有比较大的应用面的,这些动态定时器可以来自数据库,来自业务代码。
首先spring的配置还是要得,不过只需要一个bean,配置如下:
<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
</bean>
然后任务封装类,需要进行添加的任务可以new这个类的一个对象设置好属性就好了:
public class CustomJob {
public static final int JS_ENABLED = 0; // 任务启用状态
public static final int JS_DISABLED = 1; // 任务禁用状态
public static final int JS_DELETE = 2; // 任务已删除状态
private String jobId; // 任务的Id,一般为所定义Bean的ID
private String jobName; // 任务的描述
private String jobGroup; // 任务所属组的名称
private int jobStatus; // 任务的状态,0:启用;1:禁用;2:已删除
private String cronExpression; // 定时任务运行时间表达式
private String memos; // 任务描述
private Class<?> stateFulljobExecuteClass;//同步的执行类,需要从StatefulMethodInvokingJob继承
private Class<?> jobExecuteClass;//异步的执行类,需要从MethodInvokingJob继承
/**
* 得到该job的Trigger名字
* @return
*/
public String getTriggerName() {
return this.getJobId() + "Trigger";
}
/*私有字段的get,set省略*/
}
然后任务管理器封装类,这个类是对任务的统一管理功能,有增,删,查,改
/**
*
*/
package org.liyaojin.quartz.dynamic;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdScheduler;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author jl_love
*
* 2011-10-14 豁达,坚强,勤奋
*/
public class QuartzManager {
private static Scheduler scheduler;
static {
ApplicationContext context = new ClassPathXmlApplicationContext(
"quartzDynamic.xml");
scheduler = (StdScheduler) context.getBean("schedulerFactory");
}
/**
* 启动一个自定义的job
*
* @param schedulingJob
* 自定义的job
* @param paramsMap
* 传递给job执行的数据
* @param isStateFull
* 是否是一个同步定时任务,true:同步,false:异步
* @return 成功则返回true,否则返回false
*/
public static boolean enableCronSchedule(CustomJob schedulingJob,
JobDataMap paramsMap, boolean isStateFull) {
if (schedulingJob == null) {
return false;
}
try {
CronTrigger trigger = (CronTrigger) scheduler
.getTrigger(schedulingJob.getTriggerName(),
schedulingJob.getJobGroup());
if (null == trigger) {// 如果不存在该trigger则创建一个
JobDetail jobDetail = null;
if (isStateFull) {
jobDetail = new JobDetail(schedulingJob.getJobId(),
schedulingJob.getJobGroup(),
schedulingJob.getStateFulljobExecuteClass());
} else {
jobDetail = new JobDetail(schedulingJob.getJobId(),
schedulingJob.getJobGroup(),
schedulingJob.getJobExecuteClass());
}
jobDetail.setJobDataMap(paramsMap);
trigger = new CronTrigger(schedulingJob.getTriggerName(),
schedulingJob.getJobGroup(),
schedulingJob.getCronExpression());
scheduler.scheduleJob(jobDetail, trigger);
} else {
// Trigger已存在,那么更新相应的定时设置
trigger.setCronExpression(schedulingJob.getCronExpression());
scheduler.rescheduleJob(trigger.getName(), trigger.getGroup(),
trigger);
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 禁用一个job
*
* @param jobId
* 需要被禁用的job的ID
* @param jobGroupId
* 需要被警用的jobGroupId
* @return 成功则返回true,否则返回false
*/
public static boolean disableSchedule(String jobId, String jobGroupId) {
if (jobId.equals("") || jobGroupId.equals("")) {
return false;
}
try {
Trigger trigger = getJobTrigger(jobId, jobGroupId);
if (null != trigger) {
scheduler.deleteJob(jobId, jobGroupId);
}
} catch (SchedulerException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 得到job的详细信息
*
* @param jobId
* job的ID
* @param jobGroupId
* job的组ID
* @return job的详细信息,如果job不存在则返回null
*/
public static JobDetail getJobDetail(String jobId, String jobGroupId) {
if (jobId.equals("") || jobGroupId.equals("") || null == jobId
|| jobGroupId == null) {
return null;
}
try {
return scheduler.getJobDetail(jobId, jobGroupId);
} catch (SchedulerException e) {
e.printStackTrace();
return null;
}
}
/**
* 得到job对应的Trigger
*
* @param jobId
* job的ID
* @param jobGroupId
* job的组ID
* @return job的Trigger,如果Trigger不存在则返回null
*/
public static Trigger getJobTrigger(String jobId, String jobGroupId) {
if (jobId.equals("") || jobGroupId.equals("") || null == jobId
|| jobGroupId == null) {
return null;
}
try {
return scheduler.getTrigger(jobId + "Trigger", jobGroupId);
} catch (SchedulerException e) {
e.printStackTrace();
return null;
}
}
}
最后给出测试代码:
1:任务类
/**
*
*/
package org.liyaojin.quartz.dynamic;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJob;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* @author jl_love
*
* 2011-10-14
* 豁达,坚强,勤奋
*/
public class QuartzJobOne extends StatefulMethodInvokingJob {
private static int i = 0;
private int j = 0; /*说明每次执行都是new了一个新的执行类,具有线程安全性*/
/* (non-Javadoc)
* @see org.springframework.scheduling.quartz.QuartzJobBean#executeInternal(org.quartz.JobExecutionContext)
*/
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
j++;/*说明每次执行都是new了一个新的执行类,具有线程安全性*/
i++;
System.out.println("j====>" + j);/*说明每次执行都是new了一个新的执行类,具有线程安全性*/
System.out.println("这是我得第" + i + "次执行");
System.out.println("my name is QuartzJobOne");
System.out.println(context.getJobDetail().getJobDataMap().get("p2"));/*拿到传入的数据*/
if(i == 3){
System.out.println("我只执行三次.....");
QuartzManager.disableSchedule("job1","job1_group");
}
}
}
测试main方法:
/**
*
*/
package org.liyaojin.quartz.dynamic;
import java.util.ArrayList;
import org.quartz.JobDataMap;
/**
* @author jl_love
*
* 2011-10-14
* 豁达,坚强,勤奋
*/
public class QuartzManagerTest {
/**
* @param args
*/
public static void main(String[] args) {
CustomJob job = new CustomJob();
job.setJobId("job1");
job.setJobGroup("job1_group");
job.setJobName("第一个测试定时器");
job.setMemos("我是第一个测试定时器的描述");
job.setCronExpression("0/5 * * * * ?");//每五秒执行一次
job.setStateFulljobExecuteClass(QuartzJobOne.class);
JobDataMap paramsMap = new JobDataMap();
ArrayList<String> paramList = new ArrayList<String>();
paramList.add("one");
paramList.add("two");
paramList.add("three");
paramsMap.put("p1","p1");
paramsMap.put("p2",paramList);
QuartzManager.enableCronSchedule(job, paramsMap, true);
}
}
具体原理我就不多说了,重在实用。其实也没什么技术含量,主要就是调用quartz的api同时利用了spring对quartz的封装。只是为了方便自己,也为了方便大家。
我会附上该测试工程的源码,我使用的是spring 3.0.2中dist下所有的jar包,以及spring依赖包中的apacheCommons底下所有的jar包,还有quartz的jar包,我会附上jar包得截图放在源码的压缩包里面。
源代码下载地址:http://dl.iteye.com/topics/download/7a2de849-d08b-32ac-a6cf-844b35ef848f
分享到:
相关推荐
**Spring定时器TimerTask用法** 在Java世界中,`java.util.Timer` 和 `java.util.TimerTask` 是用于实现定时任务的基本工具,但它们在多线程环境中的表现并不理想,容易引发内存泄漏。Spring框架提供了更强大的定时...
### Spring 定时器知识点详解 #### 一、Spring 定时器概述 Spring 框架提供了多种方式来实现定时任务,其中一种常见的方法是使用 Quartz 作为定时任务的调度器。Quartz 是一个开源的作业调度工具,能够触发在 Java...
### 一、Spring定时器基本概念 Spring框架提供了多种方式来实现定时任务,包括基于`java.util.Timer`的`ScheduledTimerTask`和基于`java.util.concurrent.ScheduledExecutorService`的`@Scheduled`注解。本文主要...
5. **实现Job类**: 你的作业逻辑应封装在实现了`org.quartz.Job`接口的类中。当触发器激活时,Quartz会调用`execute(JobExecutionContext context)`方法。 ```java public class MyJob implements Job { @...
### Spring定时器知识点详解 #### 一、Spring定时器简介 Spring框架提供了强大的定时任务支持,可以帮助开发者在不依赖外部工具的情况下实现定时任务的管理。本文将围绕“Spring定时器”这一主题,从其实现机制、...
2. **配置Spring**:在Spring的配置文件(如`beans_video.xml`)中,定义`SchedulerFactoryBean`,它是Spring对Quartz的封装,用于初始化和管理调度器。配置如下: ```xml <bean id="scheduler" class="org.spring...
### Spring定时器概述 在Java应用开发中,经常需要执行一些定时任务,例如定时备份数据库、定时发送邮件等。Spring框架提供了多种方式来实现定时任务,其中之一便是通过集成Quartz调度器来实现。Quartz是一个功能...
本篇文章将深入探讨如何使用Spring Task来动态修改定时任务。 首先,让我们了解Spring Task的基本概念。Spring Task提供了两个主要的接口:`org.springframework.scheduling.TaskExecutor` 和 `org.springframework...
Spring定时器,或者说Spring的定时任务管理,是一个强大的功能,它允许我们在应用程序中安排一系列的任务执行,例如定期备份数据、清理缓存或者执行其他维护工作。在本实例中,我们将探讨如何使用Spring与Quartz结合...
Spring定时器,通常指的是Spring框架中的任务调度模块,它基于Quartz库进行封装,使得在Spring应用中配置和管理定时任务变得更为简便。本篇文章将深入探讨Spring如何配置定时器,以及如何使用它来执行定期任务。 ...
这个"Spring定时器Quartz"的学习资源很适合初学者,它提供了可以直接运行的示例代码,帮助你快速理解和上手。 1. **Quartz简介** - Quartz是一个开源的作业调度框架,它能够精确地安排任务执行时间,支持复杂的...
数据字典封装, 邮件发送封装,定时器封装,hibernate+spring jdbc组合使用 [4].完整用户权限封装 权限可直接使用 功能:权限,角色,用户 [5].ehcache缓存机制(永久缓存/临时缓存) 代码生成器界面: A.动态选择...
需要注意的是,实际项目中,为了更好地管理任务,通常会将任务逻辑封装到独立的服务或组件中,避免直接在`QuartzJobBean`中进行大量的业务处理。此外,还可以使用Spring的`@Scheduled`注解来创建简单的定时任务,...
标题中的“Spring定时器的使用”指的是Spring框架中的任务调度功能,主要由Spring的`TaskExecution`和`TaskScheduling`模块提供。Spring通过`@Scheduled`注解和`TaskScheduler`接口,允许开发者轻松地实现定时任务,...
全书共分14章,内容涵盖了Spring的基础概念、核心容器、Spring AOP、事务处理、持久层封装、Web框架、定时器、Spring和Struts、Spring和Hibernate、Spring和Ant、Spring和Junit。本书适用于...
全书共分14章,内容涵盖了Spring的基础概念、核心容器、Spring AOP、事务处理、持久层封装、Web框架、定时器、Spring和Struts、S pring和Hibernate、Spring和Ant、Spring和Junit。本书适用于初、中级软件开发人员...
- **兼容性**:Spring框架没有重新发明轮子,而是充分利用了现有的技术如多种ORM框架、日志框架、JEE、Quartz 和 JDK定时器等。 #### 三、使用Spring框架的好处 - **POJO支持**:Spring允许开发者使用普通的Java...
Java定时器框架Quartz是Java开发中用于任务调度的一个强大工具,它允许开发者精确地控制任务的执行时间,包括一次性任务和周期性任务。Quartz以其灵活性和稳定性,在企业级应用中广泛使用,尤其在需要定期执行后台...
#### 二、Spring定时器配置详解 在Spring中配置定时任务主要依赖于`ScheduledTimerTask`和`TimerFactoryBean`这两个类。接下来将详细介绍如何配置并使用这些类来实现定时任务。 ##### 1. 定义定时任务Bean 首先...