看了很多文章,不是花团锦簇,找到重点比较困难,就是缩减版厉害,除了本人外很少有细节
在查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方法就行了,需要用到的时候调用下
分享到:
相关推荐
在这篇文章中,软件工程师 Michael Lipton 和IT 架构师 Soobaek Jang 对 Quartz API 进行了介绍,从对框架的一般概述开始,并以一系列展示 Quart 基本特性的代码示例作为结束。在阅读完本文并看过代码示例后,您应当...
下面小编就为大家分享一篇Spring整合Quartz Job以及Spring Task的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
于是想起了 Spring 框架整合了一个作业调度框架 Quartz,其实一直没用过它,而且这回是 要脱离 Spring 框架来使用 Quartz。于是就到网上找来 Quartz 相关的资料,介绍使用倒也不含糊,但缺乏系统与深度,继而找 到的...
下面小编就为大家带来一篇Spring整合Quartz实现定时任务调度的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
spring3.2之后quartz和之前的定时服务配置稍有不同 在这里分享一个自己写的例子(代码、源码、jar包都齐全) 直接导入myeclipse即可
大多数人听说 Quartz 是在学习或使用 Spring 的时候,也就是 Spring 整合了 Quartz。 把本人博客上零零散散,顺序错乱的各篇译章汇集成册,做成了一个 《Quartz Job Scheduling Framework 中文版.chm 》文件与各位...
下面小编就为大家带来一篇spring和quartz整合,并简单调用(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
如果,除了诸位同仁网友的鼓励与期盼要感谢之外,以及他们在仔细品读后发现的许多错误之处,才得已使此译者更趋完美,同时非常感激他们阅读每一篇章的态度,这些可以在博客上的评论看得到;那么还要感谢的就是那些...
大多数人听说 Quartz 是在学习或使用 Spring 的时候,也就是 Spring 整合了 Quartz。 把本人博客上零零散散,顺序错乱的各篇译章汇集成册,做成了一个 《Quartz Job Scheduling Framework 中文版.chm 》文件与各位...
Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。 Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...
Spring3.0是Spring在积蓄了3年之久后,隆重推出的一个重大升级版本,进一步加强了Spring作为Java领域第一开源平台的翘楚地位。 Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架...
本文首先会给出关于 java后台开发 和 前端适配 的一些建议学习路线,接着简单解释一些应用到的高频技术,帮助大家理解和学习,算是一个入门篇。 2.Java后台开发知识一览 1、后端 WEB服务器:Weblogic、Tomcat、...