`
xiaoye4188
  • 浏览: 30950 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring+Quartz整合

阅读更多

Quartz是一个非常优秀的任务调度引擎,详情请见官网:[url]http://www.quartz-scheduler.org/[/url]

而Spring很好地集成了Quartz,为企业级的任务调度提供了方便。

 

下面先看一个实现了Job接口的任务HelloWorldJob:

package com.springQuartz.example;

import java.util.Map;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloWorldJob implements Job{

	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		
		Map properties = context.getMergedJobDataMap();
		
		System.out.println("Hello World!");
		System.out.println("Previous Fire Time: "+context.getPreviousFireTime());//上次触发任务的时间
		System.out.println("Current Fire Time: "+context.getFireTime());//当然触发时间
		System.out.println("Next Fire Time: "+context.getNextFireTime());//下次触发时间
		
		System.out.println(properties.get("message"));
		System.out.println();
	}
	
}

这个Job输出"HelloWorld",同时输出上次、本次及下次触发的时间。

 

我们看一下在applicationContext.xml中的配置:

<bean id="job" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.springQuartz.example.HelloWorldJob"/>
	<property name="jobDataAsMap">
	     <map>
	        <entry key="triggerMessage" value="Job Message In JobDetail"/> <!--设置JobDetail中的值-->
	     </map>
    </property>
</bean>
	
<bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail" ref="job"/> <!--触发的job引用-->
    <property name="startDelay" value="1000"/> <!--设置延迟1秒后运行-->
    <property name="repeatInterval" value="10000"/> <!--设置每10秒触发一次-->
    <property name="jobDataAsMap">
	      <map>
		  <entry key="triggerMessage" value="Job Message From Trigger"/> <!--设置Trigger中的值-->
	      </map>
    </property>
</bean>

<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	<property name="triggers">
		<list>
			<ref local="trigger"/>	
		</list>
	</property>
</bean>

我们将HelloWorldJob实现成JobDetailBean类,并配置触发器simpleTriggerBean

 

最后我们的测试类:

package com.springQuartz.test;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
	public static void main(String args[]){
		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
	}
}

运行结果如下:

2011-01-16 20:48:18,437 INFO - Starting Quartz Scheduler now
Hello World!
Previous Fire Time: null
Current Fire Time: Sun Jan 16 20:48:19 CST 2011
Next Fire Time: Sun Jan 16 20:48:29 CST 2011
Job Message From Trigger

Hello World!
Previous Fire Time: Sun Jan 16 20:48:19 CST 2011
Current Fire Time: Sun Jan 16 20:48:29 CST 2011
Next Fire Time: Sun Jan 16 20:48:39 CST 2011
Job Message From Trigger

下面说明几点:

1)首次触发是输出的Previous Fire Time为null

2)jobDataAsMap的说明:在HelloWorldJob.java中getMergedJobDataMap是JobDetail和Trigger上的JobDataMap的合并,两者数据如果冲突,则Trigger上的数据将覆盖JobDetail中的。运行结果也证明了,我们在Job中设置的值没有输出,而输出了"Job Message From Trigger"。

3)我们看到HelloWorldJob实现了Job接口,代码上依赖了Quartz的接口

 

下面我们讨论另外一种更普遍的,去除接口依赖的实现

 

主要的applicationContext.xml文件的配置

<bean id="jobService" class="com.springQuartz.service.JobServiceImpl">
</bean>
	
<bean id="invokeJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	<property name="targetObject">
		<ref bean="jobService" /> <!--目标Job-->
	</property>
	<property name="targetMethod">
		<value>JobServiceImpl中的特定方法</value> <!--目标方法-->
	</property>
	<property name="concurrent">
		<value>false</value> <!--设置是否同步-->
	</property>
</bean>
	
<bean id="jobServiceCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
	<property name="jobDetail" ref="invokeJob" />
	<property name="cronExpression" value="5/10 * * * * ?" />
</bean>

<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	<property name="triggers">
		<list>
			<ref local="jobServiceCronTrigger"/>
		</list>
	</property>
</bean>
 

1)首先我们配置具体的Job信息--JobServiceImpl,这个类可以不实现Quartz中的Job接口

2)最主要的MethodInvokingJobDetailFactoryBean,可以使得1)可行

3)相对于上面的例子,我们使用CronTriggerBean实现trigger,实现更灵活的时间配置

4)默认情况下,Quartz Jobs是无状态的,可能导致jobs之间互相的影响。如果你为相同的JobDetail 指定两个Trigger, 很可能当第一个job完成之前,第二个job就开始了。如果JobDetail 对象实现了Stateful 接口,就不会发生这样的事情。 第二个job将不会在第一个job完成之前开始。为了使得jobs不并发运行,设置MethodInvokingJobDetailFactoryBean 中的concurrent 标记为false

 

 

最近学习的东西记录下来,欢迎大家拍砖

 

 

 

 

 

 

分享到:
评论
1 楼 龙跃九江 2011-12-31  
动态,动态啊

相关推荐

    spring+quartz demo

    【Spring + Quartz 框架整合详解】 Spring 和 Quartz 是两个在 Java 开发领域中非常重要的框架。Spring 是一个全面的、开源的应用框架,提供依赖注入(DI)、面向切面编程(AOP)以及用于简化企业级应用开发的其他...

    定时框架spring+quartz

    在ssh2_quartz这个文件中,可能包含了一个示例项目,演示了如何在SSH(Struts2、Spring、Hibernate)架构下整合Quartz进行定时任务的实现。开发者可以通过分析这个项目,学习如何配置和使用Spring+Quartz,掌握在...

    spring+quartz定时小例子

    Spring 和 Quartz 是两个在 Java 开发中非常重要的框架,它们分别用于依赖注入和任务调度。Spring 是一个全方位的 Java 应用开发框架,提供了一系列强大的功能,如 AOP(面向切面编程)、DI(依赖注入)、事务管理等...

    spring+mvc+quartz.rar

    《Spring MVC + Quartz 整合实现定时任务管理》 在现代企业级应用中,系统往往需要执行一些定时任务,如数据同步、报表生成等。Spring框架以其强大的功能和灵活的扩展性,成为Java开发的首选,而Quartz作为一款开源...

    Spring + Quartz配置实例(转载)

    标题 "Spring + Quartz配置实例(转载)" 暗示了我们将讨论如何在Java环境中整合Spring框架与Quartz作业调度库的使用。Quartz是一个开源的作业调度库,它允许开发者安排任务以在特定时间执行,而Spring框架则是一个...

    spring4+hibernate5+quartz2+hdfs整合

    "spring4+hibernate5+quartz2+hdfs整合"的主题,就是将四个关键的技术组件整合在一起,以实现高效、可扩展的数据处理和任务调度解决方案。以下是这些技术组件的核心知识点: **Spring 4** Spring 是一个开源的Java...

    spring+quartz使用jar包

    1. **Spring与Quartz的整合**:Spring 提供了对Quartz的集成支持,通过`org.springframework.scheduling.quartz`包中的类,如`SchedulerFactoryBean`和`ThreadPoolTaskExecutor`,可以轻松地将Quartz纳入Spring的...

    spring+quartz定时集群支持

    Spring整合Quartz库,使得我们可以方便地在Spring应用中创建、管理和执行定时任务。Quartz是一个开源的作业调度框架,能够安排和执行复杂的定时任务。 在集群环境下,Spring+Quartz的配置需要考虑如何处理多个...

    Spring+quartz相关jar包.rar

    在实际开发中,Spring 与 Quartz 的整合步骤通常包括以下几个部分: 1. 添加依赖:在项目中引入 Spring 和 Quartz 相关的 jar 包。这些 jar 包可能包括 spring-context、spring-context-support 和 quartz-jobs、...

    spring+mybatis+quartz

    在整合这三个技术时,通常会使用Spring的ApplicationContext来加载配置,包含MyBatis的SqlSessionFactory和Mapper接口,以及Quartz的Scheduler实例。MyBatis的配置文件中,会指定数据源、事务管理器以及Mapper文件的...

    spring+quartz 动态任务方案

    #### 一、Spring与Quartz简介及整合背景 Spring 是一款轻量级的 Java 开发框架,旨在简化企业级应用开发过程中的复杂性,提供了一套完整的解决方案,包括但不限于依赖注入、面向切面编程等功能。Quartz 则是一款...

    Spring+Quartz定时调度

    本文将深入探讨Spring与Quartz的整合,以及如何利用它们来创建和管理定时任务。 ### 一、Spring与Quartz简介 **Spring** 是一个广泛使用的开源Java应用框架,它提供了依赖注入(DI)、面向切面编程(AOP)等特性,...

    mybatis + spring + springmvc + maven + json + quartz整合jar包

    本资源集合了“mybatis + spring + springmvc + maven + json + quartz”这六大核心组件,提供了完整的整合解决方案。 1. **MyBatis**:MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。它...

    spring+quartz动态定时任务创建 +mybatis

    在Spring中整合Quartz,我们可以利用Spring的管理能力,如bean的生命周期管理和事务管理,来更方便地创建和管理定时任务。 **Spring+Quartz动态定时任务创建** 将Spring与Quartz结合,我们可以方便地在运行时动态...

    Spring任务调度配置及说明(spring+quartz)

    《Spring任务调度配置详解:Spring+Quartz的整合应用》 在Java开发中,任务调度是不可或缺的一部分,Spring框架提供了与Quartz集成的能力,使得我们可以方便地管理和执行定时任务。本文将详细介绍如何通过Spring和...

    spring boot+vue+quartz2.2.3整合定时调度系统

    spring boot+vue+quartz2.2.3整合定时调度系统持久化道mysql,sql脚本在项目里面。sql文件spring boot+vue+quartz2.2.3整合定时调度系统持久化道mysql

    spring+quartz任务调度代码版

    在Spring整合Quartz的过程中,首先需要在Spring配置文件中声明Scheduler工厂bean,然后定义Job和Trigger的bean。Spring通过`org.springframework.scheduling.quartz.SchedulerFactoryBean`来创建和管理Quartz的...

    spring+quartz定时器

    通过查看这些文件,你可以更具体地了解如何将Spring 2.0和Quartz 1.6整合在一起,以及如何编写和配置定时任务。如果你遇到任何问题或需要进一步的指导,可以参考Quartz和Spring的官方文档,或者寻求社区的帮助。

    spring+quartz+javamail定时发送邮件

    本项目“spring+quartz+javamail定时发送邮件”结合了Spring框架、Quartz调度器以及JavaMail API,构建了一个能够定时发送邮件的系统。以下将详细介绍这三个关键组件及其整合方式。 首先,Spring框架是一个广泛使用...

    Spring3.0+quartz-2.1.6

    整合Spring3.0+quartz-2.1.6 ..............................................................................

Global site tag (gtag.js) - Google Analytics