`
ynztpwl
  • 浏览: 59557 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring动态定时器封装

 
阅读更多
今天在网上看到一篇文章,对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用法

    **Spring定时器TimerTask用法** 在Java世界中,`java.util.Timer` 和 `java.util.TimerTask` 是用于实现定时任务的基本工具,但它们在多线程环境中的表现并不理想,容易引发内存泄漏。Spring框架提供了更强大的定时...

    spring定时器代码注释

    ### Spring 定时器知识点详解 #### 一、Spring 定时器概述 Spring 框架提供了多种方式来实现定时任务,其中一种常见的方法是使用 Quartz 作为定时任务的调度器。Quartz 是一个开源的作业调度工具,能够触发在 Java...

    Spring中配置定时器详解.doc

    ### 一、Spring定时器基本概念 Spring框架提供了多种方式来实现定时任务,包括基于`java.util.Timer`的`ScheduledTimerTask`和基于`java.util.concurrent.ScheduledExecutorService`的`@Scheduled`注解。本文主要...

    脱离spring的quartz声明式定时器(jar包齐全)

    5. **实现Job类**: 你的作业逻辑应封装在实现了`org.quartz.Job`接口的类中。当触发器激活时,Quartz会调用`execute(JobExecutionContext context)`方法。 ```java public class MyJob implements Job { @...

    spring 定时器

    ### Spring定时器知识点详解 #### 一、Spring定时器简介 Spring框架提供了强大的定时任务支持,可以帮助开发者在不依赖外部工具的情况下实现定时任务的管理。本文将围绕“Spring定时器”这一主题,从其实现机制、...

    spring管理quart实现定时器功能

    2. **配置Spring**:在Spring的配置文件(如`beans_video.xml`)中,定义`SchedulerFactoryBean`,它是Spring对Quartz的封装,用于初始化和管理调度器。配置如下: ```xml &lt;bean id="scheduler" class="org.spring...

    spring定时器

    ### Spring定时器概述 在Java应用开发中,经常需要执行一些定时任务,例如定时备份数据库、定时发送邮件等。Spring框架提供了多种方式来实现定时任务,其中之一便是通过集成Quartz调度器来实现。Quartz是一个功能...

    使用Spring自带轻量级jar包动态修改定时任务

    本篇文章将深入探讨如何使用Spring Task来动态修改定时任务。 首先,让我们了解Spring Task的基本概念。Spring Task提供了两个主要的接口:`org.springframework.scheduling.TaskExecutor` 和 `org.springframework...

    spring定时器实例

    Spring定时器,或者说Spring的定时任务管理,是一个强大的功能,它允许我们在应用程序中安排一系列的任务执行,例如定期备份数据、清理缓存或者执行其他维护工作。在本实例中,我们将探讨如何使用Spring与Quartz结合...

    spring定时器配置

    Spring定时器,通常指的是Spring框架中的任务调度模块,它基于Quartz库进行封装,使得在Spring应用中配置和管理定时任务变得更为简便。本篇文章将深入探讨Spring如何配置定时器,以及如何使用它来执行定期任务。 ...

    spring定时器Quartz

    这个"Spring定时器Quartz"的学习资源很适合初学者,它提供了可以直接运行的示例代码,帮助你快速理解和上手。 1. **Quartz简介** - Quartz是一个开源的作业调度框架,它能够精确地安排任务执行时间,支持复杂的...

    struts2+spring3+hibernate4 + UI 组件(easyui)+代码生成器+共通封装+Spring_security权限

    数据字典封装, 邮件发送封装,定时器封装,hibernate+spring jdbc组合使用 [4].完整用户权限封装 权限可直接使用 功能:权限,角色,用户 [5].ehcache缓存机制(永久缓存/临时缓存) 代码生成器界面: A.动态选择...

    spring定时任务配置详解.doc

    需要注意的是,实际项目中,为了更好地管理任务,通常会将任务逻辑封装到独立的服务或组件中,避免直接在`QuartzJobBean`中进行大量的业务处理。此外,还可以使用Spring的`@Scheduled`注解来创建简单的定时任务,...

    Sping定时器的使用

    标题中的“Spring定时器的使用”指的是Spring框架中的任务调度功能,主要由Spring的`TaskExecution`和`TaskScheduling`模块提供。Spring通过`@Scheduled`注解和`TaskScheduler`接口,允许开发者轻松地实现定时任务,...

    Spring从入门到精通 源码

     全书共分14章,内容涵盖了Spring的基础概念、核心容器、Spring AOP、事务处理、持久层封装、Web框架、定时器、Spring和Struts、Spring和Hibernate、Spring和Ant、Spring和Junit。本书适用于...

    Spring从入门到精通(珍藏版)

     全书共分14章,内容涵盖了Spring的基础概念、核心容器、Spring AOP、事务处理、持久层封装、Web框架、定时器、Spring和Struts、S pring和Hibernate、Spring和Ant、Spring和Junit。本书适用于初、中级软件开发人员...

    java-spring经典教材

    - **兼容性**:Spring框架没有重新发明轮子,而是充分利用了现有的技术如多种ORM框架、日志框架、JEE、Quartz 和 JDK定时器等。 #### 三、使用Spring框架的好处 - **POJO支持**:Spring允许开发者使用普通的Java...

    Java定时器框架(Quartz)

    Java定时器框架Quartz是Java开发中用于任务调度的一个强大工具,它允许开发者精确地控制任务的执行时间,包括一次性任务和周期性任务。Quartz以其灵活性和稳定性,在企业级应用中广泛使用,尤其在需要定期执行后台...

    SpingMVC定时器

    #### 二、Spring定时器配置详解 在Spring中配置定时任务主要依赖于`ScheduledTimerTask`和`TimerFactoryBean`这两个类。接下来将详细介绍如何配置并使用这些类来实现定时任务。 ##### 1. 定义定时任务Bean 首先...

Global site tag (gtag.js) - Google Analytics