`
sarin
  • 浏览: 1756909 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
E3b14d1f-4cc5-37dd-b820-b6af951740bc
Spring数据库访问系列...
浏览量:173657
C2083dc5-6474-39e2-993e-263652d27795
Android学习笔记
浏览量:368124
5f40a095-b33c-3e8e-8891-606fcf3b8d27
iBatis开发详解
浏览量:189261
B272a31d-e7bd-3eff-8cc4-c0624ee75fee
Objective-C学习...
浏览量:99838
社区版块
存档分类
最新评论

Spring支持的Quartz程序调度

阅读更多
    开发时有时会有这样一种需求,定期计算某些数据或者执行某些程序进行操作,这种程序就是平时所说的批处理。批处理为应用分时段处理提供支持,减轻应用程序的负担,比如数据统计工作往往放在凌晨执行,这是服务器压力不大,使用者不多,是进行此类操作的最佳时段。白天人们使用时就能看到处理的结果了。
    批处理程序的执行思路是先创建执行定时任务,然后对定时任务进行调度执行。
    Java中的Timer类为批处理程序运行提供支持,要求扩展java.util.Timer类。Spring也支持Timer方式的调度,但是用过Quartz之后还是感觉Quartz更顺手,扩展性更强。但Quartz使用的定时方式是CRON表达式,这部分内容网上也很多,难度不大。
    先搭建一个开发环境,很简单。运用了Java EE的分层结构,但测试时只是单机运行,下面我们一一来看。

    我们在Sercice类中定义业务操作的基本方法,比如数据库操作,计算等,这里是我们具体执行业务逻辑的地方,为了说明问题,就打印一句话,如下:
package org.ourpioneer.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 调度程序业务处理类
 * 
 * @author Sarin
 * 
 */
public class QuartzService {
	private static final Logger logger = LoggerFactory
			.getLogger(QuartzService.class);

	public QuartzService() {
		logger.debug("Construct QuartzService");
	}

	public void insertIntoDB() {
		logger.debug("Run Insert Method");
	}
}

    为了结合Spring展示实例化类和方法调用顺序,这里在构造方法中也打印log。业务类很简单,定义操作的方法就行了。
    调用Service的类是Job类,就是调度程序调度的类,每个调度称为一个Job,很形象,我们来看看:
package org.ourpioneer.quartz.job;

import org.ourpioneer.service.QuartzService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 调度任务
 * 
 * @author Sarin
 * 
 */
public class QuartzJob {
	private static final Logger logger = LoggerFactory
			.getLogger(QuartzJob.class);
	// 业务类注入
	private QuartzService quartzService;

	public void setQuartzService(QuartzService quartzService) {
		this.quartzService = quartzService;
		logger.debug("QuartzService Injection");
	}

	public QuartzJob() {
		logger.debug("Construct QuartzJob");
	}

	/**
	 * 目标执行方法
	 */
	public void execute() {
		// 调度执行程序
		quartzService.insertIntoDB();
		logger.debug("Run QuartzJob");
	}
}

    Job类可以是一个简单的POJO,方法名都是随意定的,它们都是可以在Spring中配置的,Job类调用了Service类的业务方法,那么要将Service类注入。而Job类要被调度程序调度运行。
    要运行调度程序,就要在Spring容器中实例化调度程序,这在Java EE程序运行时,因为容器是时时运行的,只要加载了响应的配置文件即可,而我们单机测试,要手工启动程序,启动Spring的方法很简单:
package org.ourpioneer.quartz.app;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 任务调度测试类
 * 
 * @author Sarin
 * 
 */
public class QuartzApp {
	private static final Logger logger = LoggerFactory
			.getLogger(QuartzApp.class);

	public QuartzApp() {
		logger.debug("Construct QuartzApp");
	}

	public static void main(String[] args) {
		new ClassPathXmlApplicationContext("classpath:spring/quartz.xml");
		logger.debug("Run QuartzApp");
	}
}

    使用类路径下的XML加载方式,找到配置文件quartz.xml,来启动Spring容器。下面就剩下Spring的配置了,我们逐条来看:
<!-- Service配置 -->
<bean id="quartzService" 
class="org.ourpioneer.service.QuartzService"></bean>

    我们将Service放到Spring容器中,它会随着Spring容器加载而实例化,实现控制反转。下面是调度Job的定义:
<!-- 定义调度对象和调用的方法 -->
<bean id="quartzJob"
	class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	<property name="targetObject">
		<bean class="org.ourpioneer.quartz.job.QuartzJob">
			<property name="quartzService" ref="quartzService" />
		</bean>
	</property>
	<property name="targetMethod">
		<value>execute</value>
	</property>
</bean>

    调度对象是targetObject,在其中注入我们自定义的Job,而Job依赖quartzService,那么不能忘记注入它。下面是targetMethod设置,就是调度的方法名,前面写的是execute,这里一样。所以这就体现了配置的灵活性。
    调度程序有了,那么要定时执行,怎么来告诉控制程序来执行呢?监听时间,没错,这里使用的就是这种机制,不过不是监听器,监听器是监听事件的发生,而不能监听时间的到达,这里就是触发器,但和数据库的触发器不同,数据库的触发器还是监听了数据操作的事件,而不是时间。定点触发调度程序,要配置触发器:
<!-- 配置触发器 -->
<bean id="QuartzCornTrigger" 
	class="org.springframework.scheduling.quartz.CronTriggerBean">
	<property name="jobDetail">
		<ref local="quartzJob" />
	</property>
	<!-- 触发时间(使用cron表达式) -->
	<property name="cronExpression">
		<value>0/5 * * * * ?</value>
	</property>
</bean>

    触发器中注入了调度的Job,就是我们上面定义的quartzJob,接着设置了触发的时间,使用了CRON表达式,下面简单说说CRON表达式。
    CRON表达式使用7个域来表示时间,以空格分隔开,最后一个域是年,这个是可选的,示例中就没有。剩下的六个域依次是秒,分,小时,每月的几号,月份,一周中的周几。*号表示通配符,匹配所有值。?号也是通配符,但是只能匹配每月的几号和一周的周几,而且这两个不能同时匹配。/表示增量,就是每隔多少触发一次。每个域可以是固定数值,也可以是范围(如1-5)或一个列表(如1,3,5),好了,就这么简单。示例中的含义就是从0秒开始每隔5秒执行一次,而分,小时等都是随意的,所以它会在0,5,10,15…这样的秒数时执行。要配置每天凌晨4点执行的触发器就是0 0 4 * * ?了。
    Spring的配置就结束了,非常简单,我们来看一下bean的关系图,更直观一点:

    这里就看出了它们之间的依赖关系,下面我们来测试,启动主函数运行:

    本文系作者的实践探索,希望对使用者有用,欢迎交流。
  • 大小: 48.5 KB
  • 大小: 28.7 KB
  • 大小: 143.5 KB
21
2
分享到:
评论
10 楼 sarin 2012-08-22  
2110901055 写道
sarin 写道
2110901055 写道
您好,假如是现在要知道任务的真正执行次数怎么办?而不是数据库中有一个字段表示的任务触发的次数,谢谢。

每次执行后调用JDBC更新数据库

您好,我的思路也是这样,但不知道quartz本身调用数据库存储它本身的数据是在什么时候?在哪儿?我假如另外在再建一个字段在JOB本身的exceute方法中去更新与调用的话感觉太麻烦,利用它本身的操作我去增加点逻辑处理这样行么,怎么做?谢谢。

Quartz没有这个功能,请在Service类中注入JDBC访问的接口即可调用JDBC更新数据库
9 楼 2110901055 2012-08-22  
sarin 写道
2110901055 写道
您好,假如是现在要知道任务的真正执行次数怎么办?而不是数据库中有一个字段表示的任务触发的次数,谢谢。

每次执行后调用JDBC更新数据库

您好,我的思路也是这样,但不知道quartz本身调用数据库存储它本身的数据是在什么时候?在哪儿?我假如另外在再建一个字段在JOB本身的exceute方法中去更新与调用的话感觉太麻烦,利用它本身的操作我去增加点逻辑处理这样行么,怎么做?谢谢。
8 楼 sarin 2012-08-21  
2110901055 写道
您好,假如是现在要知道任务的真正执行次数怎么办?而不是数据库中有一个字段表示的任务触发的次数,谢谢。

每次执行后调用JDBC更新数据库
7 楼 2110901055 2012-08-21  
您好,假如是现在要知道任务的真正执行次数怎么办?而不是数据库中有一个字段表示的任务触发的次数,谢谢。
6 楼 sarin 2010-09-15  
yuantong 写道
2010-09-15 16:11:42,671 DEBUG [QuartzService.java:17] - Construct QuartzService
2010-09-15 16:11:42,718 DEBUG [QuartzJob.java:25] - Construct QuartzJob
2010-09-15 16:11:42,718 DEBUG [QuartzJob.java:21] - QuartzService Injection
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'startQuartz' defined in class path resource [spring/quartz.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/UserTransaction
Caused by: java.lang.NoClassDefFoundError: javax/transaction/UserTransaction

java.lang.NoClassDefFoundError,没有参照的类,这个类是javax/transaction/UserTransaction,也就是虚拟机运行时没有找到它,看看是什么原因吧。
5 楼 yuantong 2010-09-15  
2010-09-15 16:11:42,671 DEBUG [QuartzService.java:17] - Construct QuartzService
2010-09-15 16:11:42,718 DEBUG [QuartzJob.java:25] - Construct QuartzJob
2010-09-15 16:11:42,718 DEBUG [QuartzJob.java:21] - QuartzService Injection
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'startQuartz' defined in class path resource [spring/quartz.xml]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/UserTransaction
Caused by: java.lang.NoClassDefFoundError: javax/transaction/UserTransaction
at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1104)
at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1355)
at org.springframework.scheduling.quartz.SchedulerFactoryBean.createScheduler(SchedulerFactoryBean.java:668)
at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:568)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1062)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1029)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:420)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:247)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:178)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:244)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:158)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:287)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:348)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:92)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:77)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:68)
at org.ourpioneer.quartz.app.QuartzApp.main(QuartzApp.java:22)
4 楼 sjbwylbs 2010-09-09  
简单的Quartz例程..不用JobDetail的MethodInvokingJobDetailFactoryBean的使用
3 楼 sarin 2010-09-06  
liliugen 写道
放个demo上来更直观,

好的,今晚上传DEMO,不含类库
2 楼 liliugen 2010-09-06  
放个demo上来更直观,
1 楼 zerxd 2010-09-05  
aaaaaaa

相关推荐

    spring+quartz任务调度代码版

    通过对这些文件的深入学习和理解,你可以掌握如何在Spring环境中配置和使用Quartz进行任务调度,这对于构建有定时任务需求的应用程序非常有帮助。这个项目提供了实践经验,有助于开发者提升在企业级应用开发中的技能...

    Spring+Quartz定时调度

    ### 三、Quartz调度策略 Quartz提供了多种调度策略,包括: - **简单触发器(SimpleTrigger)**:按固定间隔重复执行任务。 - **Cron触发器(CronTrigger)**:基于Cron表达式来定义触发时间,支持复杂的定时规则...

    spring任务调度(Quartz )

    3. **调度器配置**:`SchedulerFactoryBean`是Spring对Quartz调度器的包装,它管理所有的触发器和任务。在这里,我们将`cron`触发器添加到调度器中,使得任务与触发器关联起来。 接下来,我们看下服务类和服务的...

    spring+mybatis+quartz任务调度实例和spring+quartz任务调度实例

    里面包含了两个工程项目: 1.Java project工程(含jar包,JDK1.6)。 是spring+quartz的任务调度实例。 2.Java web工程(含jar包,JDK1.7)。 spring+mybatis+quartz任务调度实例

    spring集成quartz 任务调度

    Spring集成Quartz是一款高效的任务调度框架,用于在Java应用程序中执行计划、周期性的任务。Quartz与Spring的结合,使得我们可以充分利用Spring的依赖注入(DI)和AOP特性,简化了任务调度的复杂性。 首先,Quartz...

    spring整合quartz定时任务调度

    Spring框架作为Java领域广泛使用的轻量级框架,提供了与第三方库Quartz的整合,使得开发者能够轻松地在Spring应用中实现复杂的定时任务调度。Quartz是一款开源的作业调度框架,支持丰富的调度策略,可以满足各种定时...

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

    Spring框架和Quartz是两个广泛使用的工具,它们可以协同工作以实现复杂和灵活的任务调度。本篇文章将深入探讨如何使用Spring与Quartz结合来创建一个任务调度的小例子。 首先,Spring是一个开源的Java企业级应用开发...

    Spring quartz定时调度jar包

    首先,你需要在Spring的配置文件中声明一个`SchedulerFactoryBean`,这将初始化并管理Quartz调度器。然后,你可以定义`JobDetail`和`Trigger`,`JobDetail`代表你要执行的任务,而`Trigger`定义了任务的执行时机。...

    spring+quartz demo

    Spring 提供了与 Quartz 集成的模块,使得在 Spring 应用程序中使用 Quartz 更加便捷,包括 Job 实例的管理、触发器的配置以及对 Quartz Scheduler 的控制。 在这个 "spring+quartz demo" 中,我们可以学习到如何将...

    spring quartz 任务调度

    Spring框架作为一个全面的企业级应用开发解决方案,提供了强大的任务调度支持,而Quartz则是一个流行的开源作业调度库,能够与Spring很好地集成。现在,我们就来深入探讨"spring quartz 任务调度"这一主题。 首先,...

    Spring Quartz 任务调度

    Spring Quartz 是一个基于 Java 的任务调度框架,它允许开发者定义定时任务并在应用程序中灵活地调度这些任务。这个框架是 Spring 和 Quartz Scheduler 的集成,提供了与 Spring 框架的无缝集成,使得在 Spring 应用...

    Spring中Quartz调度器的使用

    Spring 中 Quartz 调度器的使用 Spring 中 Quartz 调度器的使用是指在 Spring 框架中使用 Quartz 调度器来实现任务调度。Quartz 是一个功能强大且灵活的开源任务调度器,能够满足复杂的任务调度需求。在 Spring 中...

    quartz和spring-quartz

    Quartz是一个开源的作业调度框架,允许应用程序定义和调度任务在特定时间执行。而Spring-Quartz则是Spring框架对Quartz的集成,它使得在Spring应用中使用Quartz变得更加方便。 Quartz的核心概念包括Job(作业)、...

    Spring中Quartz调度器的使用 示例代码

    在Spring框架中集成Quartz调度器,可以实现定时任务的高效管理。Quartz是一个开源的作业调度框架,它允许程序创建、调度和执行任务。在本示例中,我们将探讨如何在Spring应用中配置和使用Quartz,以及通过示例代码来...

    Spring Quartz 任务调度实例

    Spring Quartz 是一个强大的任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。结合Spring框架,可以方便地在企业级应用中实现复杂的时间触发逻辑。本实例提供了可以直接运行的任务调度解决方案,既...

    Spring集成Quartz调度框架.pdf

    ### Spring集成Quartz调度框架详解 #### 一、Quartz调度框架概述 Quartz是一个开源的、成熟的作业调度框架,其主要目标是在Java应用程序中提供简单而强大的作业调度能力。Quartz支持作业按时间间隔(如每天、每周...

    关于spring中quartz的配置

    Quartz是一个开源的作业调度框架,可以用来在Java应用程序中安排复杂的作业任务。以下将详细介绍如何在Spring中配置Quartz以及相关知识点。 1. **引入依赖** 在开始配置之前,首先需要在项目的`pom.xml`或`build....

    spring+quartz使用jar包

    而Quartz则是一个强大的任务调度库,用于在应用程序中安排和执行周期性的任务。 Spring 集成 Quartz 的目的是为了利用Quartz的调度能力,使应用可以按需执行定时任务。以下是一些关键的知识点: 1. **Spring与...

    spring-Quartz(作业调度)

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的...

Global site tag (gtag.js) - Google Analytics