`
bluemusic
  • 浏览: 48219 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Quartz Spring动态计划一篇通

阅读更多

看了很多文章,不是花团锦簇,找到重点比较困难,就是缩减版厉害,除了本人外很少有细节

 

在查Quartz Spring动态计划的时候就有这种感觉,我发现有个人写的不错的,详见

http://www.iteye.com/topic/399980

 

不过我更希望简单点

 

 

后来终于他的代码找到了重点,所以写成日志

好了进入正题

 

Spring下的Quartz基本在配置,静态计划和动态计划的差别不大,我将两者放到一块,静态的注释掉,就清楚了

applicationContext-batchJob.xml

	<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<!-- ref bean="doTriggerJob"/ -->
				<ref local="cronTriggerProxy"/>
			</list>
		</property>
		<property name="startupDelay" value="60" />
	</bean>
	
	<!-- bean id="doTriggerJob" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="triggerDailyJob"/>
		</property>
		<property name="cronExpression" value="0 */1 * * * ?"></property>
	</bean -->
	
	<bean id="cronTriggerProxy" class="com.clbb.frm.batch.utils.AdvCronTriggerProxy" init-method="initTriggerInfo">
		<property name="jobService" ref="jobService"></property>
		<property name="jobDetail">
			<ref bean="triggerDailyJob"/>
		</property>
	</bean>
	
	<!-- 定义目标bean和bean中的方法 -->
    <bean id="triggerDailyJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
        	<ref bean="batchKernelAction"/>
        </property>
        <property name="targetMethod">
        	<value>triggerDailyJob</value>
        </property>
    </bean>
	
	<bean id="batchKernelAction" class="com.clbb.frm.batch.BatchKernelAction">
		<property name="batchKernelService" ref="batchKernelService" />
	</bean>

 

 

 

 另外个终点就在AdvCronTriggerProxy.class了,有了这个文件,读取的就是数据库的设置的间隔时间了,而不是通过配置

 

import java.text.ParseException;
import java.util.Set;

import org.quartz.JobDataMap;
import org.springframework.scheduling.quartz.CronTriggerBean;

import com.clbb.model.Job;
import com.clbb.service.JobService;

public class AdvCronTriggerProxy extends CronTriggerBean{

	private static final long serialVersionUID = 2678967427450851648L;

	private JobService jobService;

	/**
	 * @param jobService the jobService to set
	 */
	public void setJobService(JobService jobService) {
		this.jobService = jobService;
	}
	
	public void initTriggerInfo(){
		//数据库中获得需要执行的计划,这里做测试,直接取第一条
		Job job = jobService.getValidJobList().get(0);
		System.out.println("AdvCronTriggerProxy.initTriggerInfo()   "
						  + "\njobId:" + job.getJobId() 
				          + "\nname:" + job.getJobName());
		String cronExpression = job.getCronExp();
		try {
			setCronExpression(cronExpression);

			print();
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
	
	public void print(){
		if(getJobDetail() != null){
			
			System.out.println("==============================================");
			System.out.println("group:        " + getJobDetail().getGroup());
			System.out.println("name:         " + getJobDetail().getName());
			System.out.println("jobClass:     " + getJobDetail().getJobClass());
			System.out.println("datamap:      " + getJobDetail().getJobDataMap());
			System.out.println("key:          " + getJobDetail().getKey());
			System.out.println("listenernames:" + getJobDetail().getJobListenerNames());
			System.out.println("description:  " + getJobDetail().getDescription());
			System.out.println("fullname:     " + getJobDetail().getFullName());
			
			JobDataMap jobDataMap = getJobDetail().getJobDataMap();
			Set<Object> mapKeySet = jobDataMap.keySet();
			System.out.println("==============================================");
			for (Object object : mapKeySet) {
				System.out.println(object + "  :  " + jobDataMap.get(object));
			}
			System.out.println("==============================================");
			String[] listernerNames = getJobDetail().getJobListenerNames();
			for (String names : listernerNames) {
				System.out.println(names);
			}
			System.out.println("==============================================");
			
		}
	}
	
}

 

 

如果你要服务器不重启情况下你要终止服务怎么办呢?

我自己大致封装了个工具类,现在能用起来了

SchedulerUtils.java

 

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdScheduler;
import org.springframework.scheduling.quartz.CronTriggerBean;

import com.clbb.CtxUtil;
import com.clbb.util.Log;

/**
 * @author Charles King
 *
 */
public abstract class SchedulerUtils {
	
	private final static ThreadLocal<Scheduler> schedulerThread = new ThreadLocal<Scheduler>();
	
	public static Scheduler getCurrentScheduler() {
		Scheduler scheduler = (StdScheduler) CtxUtil.getBean("schedulerFactory");
		if(schedulerThread.get()==null){
			schedulerThread.set(scheduler);
		}
		return scheduler;
	}
	
	public static void finish() {
		if(schedulerThread.get()!=null){
			schedulerThread.remove();
		}
	}
	
	public static void deleteJob(String jobName, String groupName){
		Scheduler scheduler = schedulerThread.get();
		try {
			scheduler.deleteJob(jobName, groupName);
		} catch (SchedulerException e) {
			Log.error(scheduler.getClass(), e);
		} finally {
			finish();
		}
	}
	
	public static void reschedule(String triggerName, String groupName, Trigger newTrigger, JobDetail jobDetail){
		Scheduler scheduler = schedulerThread.get();
		try {
			scheduler.addJob(jobDetail, true);
			scheduler.scheduleJob(newTrigger);
			scheduler.rescheduleJob(triggerName, groupName, newTrigger);
		} catch (SchedulerException e) {
			Log.error(scheduler.getClass(), e);
		} finally {
			finish();
		}
	}
	
	public static void reschedule(CronTriggerBean dynamicTrigger, String groupName){
		Scheduler scheduler = schedulerThread.get();
		try {
			scheduler.addJob(dynamicTrigger.getJobDetail(), true);
			scheduler.scheduleJob(dynamicTrigger);
			scheduler.rescheduleJob(dynamicTrigger.getName(), groupName, dynamicTrigger);
		} catch (SchedulerException e) {
			Log.error(scheduler.getClass(), e);
		} finally {
			finish();
		}
	}

}

 

最简单关注deleteJob和reschedule方法就行了,需要用到的时候调用下

1
0
分享到:
评论

相关推荐

    spring-Quartz(作业调度)

    在这篇文章中,软件工程师 Michael Lipton 和IT 架构师 Soobaek Jang 对 Quartz API 进行了介绍,从对框架的一般概述开始,并以一系列展示 Quart 基本特性的代码示例作为结束。在阅读完本文并看过代码示例后,您应当...

    Spring整合Quartz Job以及Spring Task的实现方法

    下面小编就为大家分享一篇Spring整合Quartz Job以及Spring Task的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Quartz_Job+Scheduling_Framework

    于是想起了 Spring 框架整合了一个作业调度框架 Quartz,其实一直没用过它,而且这回是 要脱离 Spring 框架来使用 Quartz。于是就到网上找来 Quartz 相关的资料,介绍使用倒也不含糊,但缺乏系统与深度,继而找 到的...

    Spring整合Quartz实现定时任务调度的方法

    下面小编就为大家带来一篇Spring整合Quartz实现定时任务调度的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Spring+Quartz2.2.0+Demo源码实战演练【精华篇2014】

    spring3.2之后quartz和之前的定时服务配置稍有不同 在这里分享一个自己写的例子(代码、源码、jar包都齐全) 直接导入myeclipse即可

    Quartz Job Scheduling Framework 中文版 V1.0.0.chm

    大多数人听说 Quartz 是在学习或使用 Spring 的时候,也就是 Spring 整合了 Quartz。 把本人博客上零零散散,顺序错乱的各篇译章汇集成册,做成了一个 《Quartz Job Scheduling Framework 中文版.chm 》文件与各位...

    spring和quartz整合,并简单调用(实例讲解)

    下面小编就为大家带来一篇spring和quartz整合,并简单调用(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Quartz Job Scheduling Framework 中文版

    如果,除了诸位同仁网友的鼓励与期盼要感谢之外,以及他们在仔细品读后发现的许多错误之处,才得已使此译者更趋完美,同时非常感激他们阅读每一篇章的态度,这些可以在博客上的评论看得到;那么还要感谢的就是那些...

    Quartz Job Scheduling Framework 中文版 V0.8.2.chm

    大多数人听说 Quartz 是在学习或使用 Spring 的时候,也就是 Spring 整合了 Quartz。 把本人博客上零零散散,顺序错乱的各篇译章汇集成册,做成了一个 《Quartz Job Scheduling Framework 中文版.chm 》文件与各位...

    Spring.3.x企业应用开发实战(完整版).part2

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Spring3.x企业应用开发实战(完整版) part1

    Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。  Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...

    Java后端知识图谱帮助Java初学者成长.rar

    本文首先会给出关于 java后台开发 和 前端适配 的一些建议学习路线,接着简单解释一些应用到的高频技术,帮助大家理解和学习,算是一个入门篇。 2.Java后台开发知识一览 1、后端 WEB服务器:Weblogic、Tomcat、...

Global site tag (gtag.js) - Google Analytics