`
bluemusic
  • 浏览: 48859 次
  • 性别: 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的定时器的启动和停止例子

    本篇将深入探讨如何在Spring中启动和停止Quartz定时器。 首先,我们需要理解Spring和Quartz的基本概念。Spring是一个强大的Java企业级应用开发框架,它提供了依赖注入(DI)和面向切面编程(AOP)等核心特性。而...

    Springboot整合Quartz实现定时任务数据库动态配置

    本篇文章将详细探讨如何在Spring Boot项目中整合Quartz,并通过MySQL数据库实现定时任务的动态配置。 首先,我们需要在项目中添加依赖。在Spring Boot的`pom.xml`文件中,引入Spring Boot的`spring-boot-starter-...

    Spring中的Quartz配置-Spring-定时器-java定时器.doc

    在 Spring 框架中,Quartz 是一个非常流行的开源作业调度器,可以实现任务的定时执行。在本篇文章中,我们将讨论如何在 Spring 中配置 Quartz,以实现 Java 定时器的功能。 Quartz 介绍 Quartz 是一个开源的作业...

    Spring+Quartz example

    这篇描述提到了一个Spring+Quartz的示例项目,它展示了如何在Spring应用中集成Quartz来实现定时任务。通过提供的博客链接(http://blog.csdn.net/u010397369/article/details/17465649),我们可以了解到具体的操作...

    spring+quartz动态设置定时时间

    本篇文章将深入探讨如何在Spring与Quartz结合的环境中动态设置定时时间。 首先,Spring框架提供了方便的依赖注入和AOP(面向切面编程)功能,使得集成其他库变得更加容易。Quartz是一个强大的作业调度框架,它可以...

    定时器的配置文件(两种方式:springmvc自带定时,Quartz与spring结合的定时)

    本篇文章将详细讲解两种在Spring MVC框架中实现定时任务的方法:Spring MVC自带的定时器以及Quartz与Spring的集成。 首先,我们来看看Spring MVC自带的定时任务。Spring MVC作为Spring框架的一个模块,主要处理HTTP...

    Spring+Quartz 集群

    本篇文章将深入探讨如何在Spring环境中集成Quartz以构建一个高可用的集群。 首先,我们需要理解Spring和Quartz的核心功能。Spring作为一个全面的Java应用开发框架,提供了依赖注入(DI)、面向切面编程(AOP)以及...

    利用spring的ApplicationContext在程序中唤醒quartz的job

    本篇文章将探讨如何结合Spring的ApplicationContext和Quartz,实现在程序中动态唤醒和管理Quartz的Job。 首先,`AppService.java`很可能包含了一个服务类,该类可能负责与Quartz相关的业务逻辑,例如创建、更新或...

    spring定时任务之Quartz

    这篇博客将探讨如何在Spring中集成Quartz来实现定时任务。 首先,我们需要引入Quartz的依赖。在Maven的pom.xml文件中,添加以下依赖: ```xml &lt;groupId&gt;org.quartz-scheduler &lt;artifactId&gt;quartz &lt;version&gt;...

    Spring定时器quartz

    这篇博客可能探讨了如何在Spring框架中集成Quartz,以实现灵活、可扩展的任务调度。 Quartz是一个开源的作业调度框架,支持 cron 表达式和其他定时规则来安排任务。它具有强大的功能,例如并发性控制、持久化作业...

    Spring3.2.3+Quartz2.2 整合配置

    本篇文章将详细介绍如何将Spring 3.2.3版本与Quartz 2.2版本进行整合配置,以便在Spring应用中实现灵活的定时任务管理。 首先,集成Quartz到Spring项目中,我们需要在项目的`pom.xml`或`build.gradle`文件中添加...

    Quartz 在 Spring 中如何动态配置时间

    本篇文章将详细探讨如何在Spring中动态配置Quartz,以及相关的核心知识点。 首先,我们需要在项目中引入Quartz和Spring的依赖。在Maven的pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;org.quartz-scheduler ...

    spring quartz实现触发器demo(笔记)

    这篇笔记将深入探讨如何使用Spring与Quartz结合来实现触发器的示例。 首先,Quartz是一个开源的作业调度框架,它允许开发者定义任务并在预定的时间点执行。Spring则是一个强大的应用框架,提供了依赖注入(DI)和...

    Quartz和Spring整合

    Quartz和Spring整合是企业级应用中常见的任务调度解决方案,Quartz是一个开源的作业调度框架,而Spring则是Java领域广泛使用的轻量级框架。这两者的整合使得开发者可以在Spring管理的bean中灵活地定义和执行定时任务...

    springboot整合Quartz实现动态配置定时任务源码

    本篇文章将详细探讨如何在SpringBoot项目中整合Quartz,实现动态配置定时任务。 首先,我们需要在SpringBoot项目中引入Quartz的相关依赖。在`pom.xml`文件中添加以下Maven依赖: ```xml &lt;groupId&gt;org.spring...

    Quartz spring配置

    本篇将详细介绍如何在Spring项目中配置并使用Quartz。 首先,我们需要在项目的pom.xml文件中添加Quartz和Spring的相关依赖。确保引入了以下依赖: ```xml &lt;groupId&gt;org.quartz-scheduler &lt;artifactId&gt;quartz ...

    Spring+Quartz实现任务调度的小例子

    本篇文章将深入探讨如何使用Spring与Quartz结合来创建一个任务调度的小例子。 首先,Spring是一个开源的Java企业级应用开发框架,它提供了丰富的功能,包括依赖注入、数据访问、事务管理等。而Quartz则是一个强大的...

    Spring整合Quartz定时发送邮件

    标签中的“源码”意味着这篇博文可能会深入到Quartz和Spring的源代码层面,解析如何配置和定制这两个组件以实现定时发送邮件。源码分析有助于理解底层工作原理,提高问题排查和优化能力。 接下来是“工具”标签,这...

    Java关于时间调度的几种实现方(Timer Quartz Spring)

    本篇文章将深入探讨Java中的三种主要时间调度实现:`Timer`、`TimerTask`、以及第三方库`Quartz`和`Spring`的定时任务功能。 ### 1. Java `Timer` 和 `TimerTask` `java.util.Timer` 类提供了一个调度任务的方法,...

    浅谈Spring中的Quartz配置

    这篇博文主要探讨了如何在Spring应用中配置和使用Quartz。 首先,我们需要理解Quartz的基本概念。Quartz由几个核心组件组成,包括Scheduler、Job、Trigger和Calendar。Scheduler是调度器,负责管理和执行任务;Job...

Global site tag (gtag.js) - Google Analytics