`
uule
  • 浏览: 6337741 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

使用Quartz实现项目中的任务调度

阅读更多

360图书馆 - Quartz任务调度

 

网上搜集加自己总结,闲话少说:

 

使用Quartz实现项目中的任务调度的基本步骤:

1、创建jobDetail作业任务

2、创建任务触发器

3、创建任务调度工厂来启动触发器

 

1、创建JobDetail

 

JobDetailBean:
       用户可以直接使用Quartz的JobDetail在Spring中配置一个JobDetail Bean,但是JobDetail使用带参的构造函数,对于习惯通过属性配制的Spring用户来说存在使用上的不便。为此Spring通过扩展JobDetail提供了一个更具Bean风格的JobDetailBean。

    JobDetailBean扩展于Quartz的JobDetail。使用该Bean声明JobDetail时,Bean的名字即是任务的名字,如果没有指定所属组,就使用默认组。除了JobDetail中的属性外,还定义了以下属性:

    JobClass:类型为Class,实现Job接口的任务。

   BeanName:默认为Bean的ID名,通过该属性显式指定Bean名称,它对应任务的名称。

   JobDateAsMap:类型为Map,为任务所对应的JobDataMap提供值。之所以需要提供这个属性,是因为用户无法在Spring配置文件为JobDataAsMap类型的属性提供信息,所以Spring通过jobDataAsMap设置JobDataMap的值。

  ApplicationContextJobDataKey:用户可以将Spring ApplicationContext的引用保存到JobDataMap中,以便在Job的代码中访问ApplicationContext。为了达到这个目的,用户需要指定一个键,用以在jobDataAsMap中保存  ApplicationContext,如果不设置此键,JobDetailBean就不将ApplicationContext放入到JobDataMap中。
          JobListenerNames;类型为String[],指定注册在Scheduler中的JobListeners名称,以便让这些监听器对本任务的事件进行监听。

    <bean id="autoSendJob"
        class="org.springframework.scheduling.quartz.JobDetailBean">
        <property name="jobClass">
            <value>com.techson.himsnanhwa.admin.scheduler.AutoSendScheduler</value>
        </property>
        <property name="applicationContextJobDataKey" value="applicationContext"/>
        <property name="jobDataAsMap">
	        <map>	        	
            	<entry key="days">
	                <value>1</value>
                </entry>               
            	<entry key="isAutoSend">
	                <value>false</value>
                </entry>
                <entry key="isDebug">
	                <value>false</value>
                </entry>
            </map>
        </property>
    </bean>

 days、isAutoSend、isDebug是类中AutoSendScheduler中自己定义的属性!

public class AutoSendScheduler extends QuartzJobBean {	

	private int days=1;
	private Boolean isAutoSend;
	private Boolean isDebug;
	
	protected void executeInternal(JobExecutionContext arg0) {			
		Map dataMap = arg0.getJobDetail().getJobDataMap();
		ApplicationContext appCtx = (ApplicationContext)dataMap.get("applicationContext");
		。。。
	}
}

 

MethodInvokingJobDetailFactoryBean :

Spring 为我们提供了 MethodInvokingJobDetailFactoryBean ,借由该 FactoryBean ,我们可以将一个 Bean 的某种方法封装成满足 Quartz 要求的 Job .

<bean id="jobDetail_1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
          <property name="targetObject" ref="myService">
          <property name="targetMethod" value="doJob">
          <property name="concurrent" value="false">
</bean>

<bean id="myService" class="com.test.myService" />

 

public class MyService(){
         public void doJob(){
                 System.out.println("doJobing.....");
         }
}

 jobDetail_1将MyService#doJob()封装成一个任务,同时通过concurrent属性指定任务的类型,默认情况下封装为无状态的任务,如果希望目标封装为有状态的任务,仅需要将concurreng设置成false就可以了。
Spring通过名为concurrent的属性指定任务的类型 ,能够更直接地描述任务执行的方式(有状态的任务不能并发执行,无状态的任务可并发执行 )

 

doJob() 方法即可以是 static ,也可以是非 static 的,但不能拥有方法入参 。通过 MethodInvokingJobDetailFactoryBean 产生的 JobDetail 不能被序列化,所以不能不持久化到数据库中,如果希望使用持久化任务,用户只能创建正规的 Quartz Job 实现了。

 

 

2、创建触发器:

 

简单触发器:

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">

        <property name="jobDetail">
            <ref bean="autoSendJob"/>
        </property>

        <!-- 工作执行的频率,以毫秒为单位 -->
        <property name="repeatInterval">
            <value>60000</value>
        </property>
</bean>

 简单触发器SimpleTriggerBean基本属性repeatInterval、repeatCount

 

这里我们设置了每隔一分钟执行一次我们创建的工作。 SimpleTriggerBean 只能让我们指定工作执行的频率,不能让我们指定工作执行的具体时间。比方说,我们要求在每天的晚上 10 点执行某个具体的工作,那么 SimpleTriggerBean 就不能满足我们的需求了,这个时候我们需要使用另外一个 bean CronTriggerBean

 

Cron触发器:

CronTrigger 支持比 SimpleTrigger 更具体的调度,而且也不是很复杂。基于 cron 表达式,CronTrigger 支持类似日历的重复间隔,而不是单一的时间间隔。

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

        <property name="jobDetail">
            <ref bean="autoSendJob"/>
        </property>

        <property name="cronExpression">
            <value>0 0 22 * * ? *</value>
        </property>
</bean>

 

这个配置指定了每天晚上 10 点执行我们的工作,使用 CronTriggerbean 我们可以精确的控制任务运行的时间,这个运行时间我们是通过 cronExpression 属性指定的,它是一个 cron 表达式,下面说一下这个表达式的语法。

一个 cron 表达式有 6 个必选的元素和一个可选的元素,各个元素之间是以空格分隔的,从左至右,这些元素的含义如下表所示:


* :代表所有可取的值,比如说,如果分钟为 * ,那么就表示每一分钟;

? 只有月份中的天数和星期中的天数可以使用?来表示,因为“月份中的天数”和“星

  期中的天数”不能同时设值,所以我们可以通过?来表明不想设置的那个元素

- :用来指定一个范围类的值,比如说,小时为 ”10-12” ,它就表示 10 点、 11 点、 12

, :逗号用来分隔一个元素的多个值,比如说“星期中的天数”为 "MON,WED,FRI"

  它就表示周一、周三和周五。

/ :斜杠用来表示间隔,比如说,秒数为 5/10 ,那么它就表示第 5 秒、第 15 秒、第

  25 秒、第 35 秒、第 45 秒和第 55 秒。斜杠前的数字表示起始位置,后面的数字表

  示每次增长的数量。

L :仅用在“月份中的天数”和“星期中的天数”元素中。如果是前者,它代表某月的

   最后一天;如果是后者,它就表示是周六。有一点特别的,当表示“星期中的天数”

    时, L 可以和数字一起用,比如 ”6L” ,它就表示这个月的最后一个星期五。

W :只能用来表示“月份中的天数”,和数字一起使用。比如说 15W ,它就表示离这

    个月 15 号最近的工作日。使用 W 时,“月份中的天数”必须为一个指定的日期,

    而不能是一个范围的日期。

# :只能用来表示“星期中的天数”。例如 5#4 ,它表示某个月中第四个星期四, 2#1

   表示某个月中第一个星期一。 # 前面的数字代表星期,后面的数字表示是第几个。

 

3、创建触发器调度工厂

 

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <!-- 一组触发器 -->
        <property name="triggers">
            <list>
                 <ref bean="simpleTrigger"/>
            </list>
        </property>
    </bean>

 

。。。

参考:

http://blog.csdn.net/CMTobby/archive/2007/09/21/1795257.aspx

http://www.easyjf.com/blog/html/20071230/1015808.html

http://www.iteye.com/topic/144515

http://www.iteye.com/topic/290532

http://www.ibm.com/developerworks/cn/java/j-quartz/

  • 大小: 42.6 KB
分享到:
评论

相关推荐

    ASP.NET使用Quartz.NET实现定时任务调度

    结合使用Quartz.NET和TopShelf,我们可以构建一个在Windows服务中运行的定时任务调度系统。 Quartz.NET的特性包括: 1. **灵活的调度**:Quartz.NET支持多种调度模式,如简单触发器、cron触发器,可以按照精确时间...

    Java使用quartz实现任务调度定时任务

    本篇文章将深入探讨如何使用Quartz在Java应用程序中实现任务调度。 Quartz库提供了一个灵活的API,可以创建、调度和管理任务,这些任务被称为Job。每个Job都与一个Trigger关联,Trigger定义了何时启动Job。在Java...

    quartz实现动态任务定时调度

    首先,为了在项目中使用 Quartz,你需要从官方网站或通过 Maven/Gradle 下载 Quartz 的 JAR 包。确保下载的版本与你的项目所使用的其他库兼容。此外,如果你的数据库驱动是 Proxool,可能需要升级到最新版本以避免...

    Java中使用Quartz实现任务自动调度的经典例子!

    Quartz是Java中一个强大的开源任务调度库,它允许开发者定义和执行短时或周期性的任务。...通过学习和实践这个例子,你将能够熟练地在Java项目中使用Quartz进行任务调度,实现复杂的工作流自动化。

    利用Quartz实现任务调度的集群

    【Quartz任务调度集群】是Java开发中解决定时任务需求的一种高效方案,它由OpenSymphony团队开发,自2001年以来广泛应用于各种项目。Quartz的核心优势在于其灵活性和简单性,允许开发者自由定义任务触发的时间表,...

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

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

    Quartz.net作业调度自定义定时执行任务多任务执行c#

    在"Quartz.net作业调度自定义定时执行任务多任务执行c#"这个主题中,我们将深入探讨如何使用Quartz.NET来实现自定义的定时任务,以及如何处理多任务执行。 首先,我们需要理解Quartz.NET的基本概念。在Quartz.NET中...

    Quartz任务调度器

    在与Spring框架整合后,Quartz能更好地融入到现有的应用架构中,实现更高效的资源管理和任务调度。 首先,我们要理解Quartz的核心概念。`Job`是Quartz中的基本工作单元,它代表一个要执行的任务。而`Trigger`则定义...

    SpringBoot 整合Quartz(集群)实现定时任务调度

    SpringBoot整合Quartz实现定时任务调度是企业级应用中常见的需求,主要用于自动化执行某些周期性的任务,例如数据备份、报表生成、系统维护等。Quartz是一个功能强大的开源作业调度框架,能够灵活地定义任务和调度...

    Quartz.Net任务调度

    通过上述步骤,你可以在C#项目中利用Quartz.Net实现复杂的任务调度需求。这个QuartzDemo压缩包很可能是包含了一个简单的Quartz.Net应用实例,你可以解压后学习其结构和代码,以便更好地理解和使用这个强大的任务调度...

    springboot+quartz实现动态定时任务调度

    基于SpringBoot+Quartz实现动态任务调度,可作为单独模块镶嵌到项目中,同时还支持多数据源配置。项目运行中就可实现定时任务的动态增删改查,不用启停项目,摆脱了普通SpringBoot定时任务注解,需要重启才能生效...

    任务调度开源框架Quartz

    通过阅读《任务调度框架Quartz.doc》文档,你将能够深入理解Quartz的内部机制,学习如何创建和配置作业与触发器,以及如何在实际项目中集成和使用Quartz。文档可能还会涵盖Quartz的源码分析,这对于想要定制或优化...

    利用Quartz.net实现任务调度

    Quartz.NET是一款强大的开源任务调度库,它允许开发者在.NET应用程序中定义、安排和执行周期性的任务。Quartz.NET的设计灵感来源于Java的Quartz项目,它提供了高度灵活且可靠的作业调度框架,支持复杂的调度需求。 ...

    C#基于Quartz任务调度系统

    本项目“C#基于Quartz任务调度系统”就是利用Quartz.NET来实现任务自动化执行,而且在实际运行环境中已经稳定运行了两年,充分证明了其可靠性和稳定性。 **Quartz.NET介绍** Quartz.NET是Quartz的.NET版本,它提供...

    spring任务调度(Quartz )

    首先,要在Spring中使用Quartz,你需要将`quartz-all-1.5.2.jar`等相关的Quartz库添加到项目的类路径中。这个库包含了Quartz所需的所有组件,使你可以方便地创建和管理定时任务。 在配置文件中,我们通常会创建一个...

    使用Quartz.net v3.0.7.0的任务调度

    总结,Quartz.NET v3.0.7.0提供了强大的任务调度功能,通过QuartzDemo项目,你可以深入理解其工作原理,并将其应用于实际项目中,实现灵活、高效的任务调度。在实践中,需要注意合理设计作业和触发器,确保任务的...

    任务调度系统基于Quartz.net

    在"任务调度系统基于Quartz.net"的项目中,我们将深入探讨如何利用Quartz.NET来构建高效、可扩展的任务调度解决方案。 Quartz.NET的核心概念包括作业(Job)、触发器(Trigger)和调度器(Scheduler)。作业是实际...

    任务调度Quartz框 架

    默认情况下,Quartz使用内存存储,但为了保证任务调度的高可用性和持久性,通常会配置使用数据库来保存调度信息。这样,即使应用程序重启,之前调度的Job和Trigger也会被重新加载。 ### 结语 Quartz作为一个功能...

    quartz 定时任务调度

    在“quartz 定时任务调度”这个主题中,我们将深入探讨Quartz的主要特性、如何使用cron表达式以及在MVC版本中的应用,同时也会提及插件部署。 1. **Quartz简介** Quartz是一个开源的作业调度库,它允许开发人员将...

Global site tag (gtag.js) - Google Analytics