看了很多文章,不是花团锦簇,找到重点比较困难,就是缩减版厉害,除了本人外很少有细节
在查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方法就行了,需要用到的时候调用下
分享到:
相关推荐
本篇将深入探讨如何在Spring中启动和停止Quartz定时器。 首先,我们需要理解Spring和Quartz的基本概念。Spring是一个强大的Java企业级应用开发框架,它提供了依赖注入(DI)和面向切面编程(AOP)等核心特性。而...
本篇文章将详细探讨如何在Spring Boot项目中整合Quartz,并通过MySQL数据库实现定时任务的动态配置。 首先,我们需要在项目中添加依赖。在Spring Boot的`pom.xml`文件中,引入Spring Boot的`spring-boot-starter-...
在 Spring 框架中,Quartz 是一个非常流行的开源作业调度器,可以实现任务的定时执行。在本篇文章中,我们将讨论如何在 Spring 中配置 Quartz,以实现 Java 定时器的功能。 Quartz 介绍 Quartz 是一个开源的作业...
这篇描述提到了一个Spring+Quartz的示例项目,它展示了如何在Spring应用中集成Quartz来实现定时任务。通过提供的博客链接(http://blog.csdn.net/u010397369/article/details/17465649),我们可以了解到具体的操作...
本篇文章将深入探讨如何在Spring与Quartz结合的环境中动态设置定时时间。 首先,Spring框架提供了方便的依赖注入和AOP(面向切面编程)功能,使得集成其他库变得更加容易。Quartz是一个强大的作业调度框架,它可以...
本篇文章将详细讲解两种在Spring MVC框架中实现定时任务的方法:Spring MVC自带的定时器以及Quartz与Spring的集成。 首先,我们来看看Spring MVC自带的定时任务。Spring MVC作为Spring框架的一个模块,主要处理HTTP...
本篇文章将深入探讨如何在Spring环境中集成Quartz以构建一个高可用的集群。 首先,我们需要理解Spring和Quartz的核心功能。Spring作为一个全面的Java应用开发框架,提供了依赖注入(DI)、面向切面编程(AOP)以及...
本篇文章将探讨如何结合Spring的ApplicationContext和Quartz,实现在程序中动态唤醒和管理Quartz的Job。 首先,`AppService.java`很可能包含了一个服务类,该类可能负责与Quartz相关的业务逻辑,例如创建、更新或...
这篇博客将探讨如何在Spring中集成Quartz来实现定时任务。 首先,我们需要引入Quartz的依赖。在Maven的pom.xml文件中,添加以下依赖: ```xml <groupId>org.quartz-scheduler <artifactId>quartz <version>...
这篇博客可能探讨了如何在Spring框架中集成Quartz,以实现灵活、可扩展的任务调度。 Quartz是一个开源的作业调度框架,支持 cron 表达式和其他定时规则来安排任务。它具有强大的功能,例如并发性控制、持久化作业...
本篇文章将详细介绍如何将Spring 3.2.3版本与Quartz 2.2版本进行整合配置,以便在Spring应用中实现灵活的定时任务管理。 首先,集成Quartz到Spring项目中,我们需要在项目的`pom.xml`或`build.gradle`文件中添加...
本篇文章将详细探讨如何在Spring中动态配置Quartz,以及相关的核心知识点。 首先,我们需要在项目中引入Quartz和Spring的依赖。在Maven的pom.xml文件中添加如下依赖: ```xml <groupId>org.quartz-scheduler ...
这篇笔记将深入探讨如何使用Spring与Quartz结合来实现触发器的示例。 首先,Quartz是一个开源的作业调度框架,它允许开发者定义任务并在预定的时间点执行。Spring则是一个强大的应用框架,提供了依赖注入(DI)和...
Quartz和Spring整合是企业级应用中常见的任务调度解决方案,Quartz是一个开源的作业调度框架,而Spring则是Java领域广泛使用的轻量级框架。这两者的整合使得开发者可以在Spring管理的bean中灵活地定义和执行定时任务...
本篇文章将详细探讨如何在SpringBoot项目中整合Quartz,实现动态配置定时任务。 首先,我们需要在SpringBoot项目中引入Quartz的相关依赖。在`pom.xml`文件中添加以下Maven依赖: ```xml <groupId>org.spring...
本篇将详细介绍如何在Spring项目中配置并使用Quartz。 首先,我们需要在项目的pom.xml文件中添加Quartz和Spring的相关依赖。确保引入了以下依赖: ```xml <groupId>org.quartz-scheduler <artifactId>quartz ...
本篇文章将深入探讨如何使用Spring与Quartz结合来创建一个任务调度的小例子。 首先,Spring是一个开源的Java企业级应用开发框架,它提供了丰富的功能,包括依赖注入、数据访问、事务管理等。而Quartz则是一个强大的...
标签中的“源码”意味着这篇博文可能会深入到Quartz和Spring的源代码层面,解析如何配置和定制这两个组件以实现定时发送邮件。源码分析有助于理解底层工作原理,提高问题排查和优化能力。 接下来是“工具”标签,这...
本篇文章将深入探讨Java中的三种主要时间调度实现:`Timer`、`TimerTask`、以及第三方库`Quartz`和`Spring`的定时任务功能。 ### 1. Java `Timer` 和 `TimerTask` `java.util.Timer` 类提供了一个调度任务的方法,...
这篇博文主要探讨了如何在Spring应用中配置和使用Quartz。 首先,我们需要理解Quartz的基本概念。Quartz由几个核心组件组成,包括Scheduler、Job、Trigger和Calendar。Scheduler是调度器,负责管理和执行任务;Job...