目录[-]

  • 一、Spring创建JobDetail的两种方式
  • 二、整合方式一示例步骤
  • 1、将spring核心jar包、quartz.jar和Spring-context-support.jar导入类路径。
  • 2、编写Job类PunchJob(该类必须继承QuartzJobBean)
  • 3、编写quartz.xml配置文件
  • 4、让容器加载quartz.xml
  • 5、配置quartz的运行环境:quartz.properties文件(放在类路径下)
  • 三、注意事项

一、Spring创建JobDetail的两种方式

定时任务两种方式,Spring很好的封装使用Quartz的细节,第一种方式是利用SPring封装的Quartz类进行特定方法的实现,第二种是通过透明的使用Quartz达到定时任务开发的目的,总体说第二种对开发人员更方便!

配置Spring的任务调度抽象层简化了任务调度,在Quartz的基础上提供了更好的调度对象。Spring使用Quartz框架来完成任务调度,创建Quartz的作业Bean(JobDetail),有一下两种方法:

1:利用JobDetailBean包装QuartzJobBean子类(即Job类)的实例。

 2:利用MethodInvokingJobDetailFactoryBean工厂Bean包装普通的Java对象(即Job类)。

说明:

 1:采用第一种方法 创建job类,一定要继承QuartzJobBean ,实现 executeInternal(JobExecutionContext
jobexecutioncontext)方法,此方法就是被调度任务的执行体,然后将此Job类的实例直接配置到JobDetailBean中即可。这种方法和在普通的Quartz编程中是一样的。

 2:采用第二种方法 创建Job类,无须继承父类,直接配置MethodInvokingJobDetailFactoryBean即可。但需要指定一下两个属性:

targetObject:指定包含任务执行体的Bean实例。

targetMethod:指定将指定Bean实例的该方法包装成任务的执行体。

二、整合方式一示例步骤

   1、将spring核心jar包、quartz.jar和Spring-context-support.jar导入类路径。

千万不忘了导入spring-context-support-3.2.0.M2.jar:这是因为这种方式是利用SPring封装的Quartz类进行特定方法的实现。

我们用到的两个JobDetail:org.springframework.scheduling.quartz.JobDetailBean 和org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean ;

触发器:org.springframework.scheduling.quartz.CronTriggerBean  ;调度器:org.springframework.scheduling.quartz.SchedulerFactoryBean 都来源于这个jar包。

2、编写Job类PunchJob(该类必须继承QuartzJobBean)

[java]  view plain copy

 
  1. package org.crazyit.hrsystem.schedule;
  2. import java.util.Date;
  3. import org.springframework.scheduling.quartz.QuartzJobBean;
  4. import org.quartz.JobExecutionContext;
  5. import org.quartz.JobExecutionException;
  6. import org.crazyit.hrsystem.service.EmpManager;
  7. public class PunchJob
  8. extends QuartzJobBean
  9. {
  10. //判断作业是否执行的旗标
  11. private boolean isRunning = false;
  12. //该作业类所依赖的业务逻辑组件
  13. private EmpManager empMgr;
  14. public void setEmpMgr(EmpManager empMgr)
  15. {
  16. this.empMgr = empMgr;
  17. }
  18. //定义任务执行体
  19. public void executeInternal(JobExecutionContext ctx)
  20. throws JobExecutionException
  21. {
  22. if (!isRunning)
  23. {
  24. System.out.println("开始调度自动打卡");
  25. isRunning = true;
  26. //调用业务逻辑方法
  27. empMgr.autoPunch();
  28. isRunning = false;
  29. }
  30. }
  31. }

3、编写quartz.xml配置文件

[html]  view plain copy

 
  1. <?xml version="1.0" encoding="GBK"?>
  2. <!-- 指定Spring配置文件的Schema信息 -->
  3. <beans xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:p="http://www.springframework.org/schema/p"
  7. xmlns:tx="http://www.springframework.org/schema/tx"
  8. xsi:schemaLocation="http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  10. http://www.springframework.org/schema/tx
  11. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  12. http://www.springframework.org/schema/aop
  13. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
  14. default-lazy-init="false">
  15. <!-- 定义<span style="font-family:'courier new','courier';">一</span>个业务逻辑组件,继承业务逻辑组件的模板 -->
  16. <bean id="empManager"
  17. class="org.crazyit.hrsystem.service.impl.EmpManagerImpl"
  18. parent="managerTemplate"/>
  19. <!-- 定义触发器来管理任务Bean -->
  20. <bean id="cronTriggerPunch"
  21. class="org.springframework.scheduling.quartz.CronTriggerBean">
  22. <property name="jobDetail">
  23. <!-- 使用嵌套Bean的方式来定义任务Bean -->
  24. <bean
  25. class="org.springframework.scheduling.quartz.JobDetailBean">
  26. <!-- 指定任务Bean的实现类 -->
  27. <property name="jobClass"
  28. value="org.crazyit.hrsystem.schedule.PunchJob"/>
  29. <!-- 为任务Bean注入属性 -->
  30. <property name="jobDataAsMap">
  31. <map>
  32. <entry key="empMgr" value-ref="empManager"/>
  33. </map>
  34. </property>
  35. </bean>
  36. </property>
  37. <!-- 指定Cron表达式:周一到周五7点、12点执行调度 -->
  38. <property name="cronExpression"
  39. value="0 0 7,12 ? * MON-FRI"/>
  40. </bean>
  41. <!-- 执行实际的调度器-->
  42. <bean
  43. class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  44. <property name="triggers">
  45. <list>
  46. <ref bean="cronTriggerPunch"></ref>
  47. <!--    <ref local="cronTriggerPunch"/> 两者都可以用 -->
  48. </list>
  49. </property>
  50. </bean>
  51. </beans>

job data map(jobDataAsMap)可通过JobExecutionContext (执行时传递)获取。JobDetailBean将 job data map的属性映射到job的属性。如例所示,如果job类PunchJob中包含一个empMgr属性,JobDetailBean将自动注入到Job类PunchJob的实例中,可用于传递参数。如果不写明,就会报
java.lang.NullPointerException错误,主要是因为没有注入Bean。

在上面的配置中我们是让触发器和任务嵌套的,其实还可以将他们分离,形如:

   <!-- 定义JobDetail的Bean -->

<bean id="saveProjectJob"
        class="org.springframework.scheduling.quartz.JobDetailBean">

     <!-- 定义Job的Bean -->

<property name="jobClass">
        <value>
        com.gresoft.fileupload.service.ParseFileQuartz
        </value>
        </property>

  <!-- 定义Job的Bean中引用到的其他Bean -->

<property name="jobDataAsMap">
          <map>
            <entry key="readXmlService">
            <ref bean="readXmlService" />
        </entry>
          </map>
        </property>
   </bean>

<!-- ----------------------------------------------------------- -->

 <!-- 定义触发器的Bean -->

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

 <!-- 指定jobDetail -->

<property name="jobDetail">

<!--   <ref bean="saveProjectJob"></ref>两者都可以用 -->

<ref local="saveProjectJob" />
        </property>

 <!-- 指定任务触发的时间 -->

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

4、让容器加载quartz.xml

在web.xml中添加:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/quartz.xml</param-value>
     </context-param>

###其实quartz.xml文件的内容完全可以写在applicationContext.xml中的,不过那样会显得杂乱。

5、配置quartz的运行环境:quartz.properties文件(放在类路径下)

文件名必须叫此名字,其实此文件我们也可以不配置的。

[html]  view plain copy

 
  1. # 配置主调度器属性
  2. org.quartz.scheduler.instanceName = QuartzScheduler
  3. org.quartz.scheduler.instanceId  = AUTO
  4. # 配置线程池
  5. # Quartz线程池的实现类
  6. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
  7. # 线程池的线程数量
  8. org.quartz.threadPool.threadCount = 1
  9. # 线程池里线程的优先级
  10. org.quartz.threadPool.threadPriority = 10
  11. # 配置作业存储
  12. org.quartz.jobStore.misfireThreshold = 60000
  13. org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

如果我们不配置此文件的话,默认使用quartz-2.1.6.jar中的quartz.properties文件(在该压缩文件的org/quartz路径下),如果需要改变其运行属性,我们可以自己创建一个quartz.properties文件,并将该文件放在系统加载的类路径下,ClassLoader就会自动加载并启用其中的各种属性。

三、注意事项

在Spring配置和Quartz集成内容时,有两点需要注意
           1、在<Beans>中不能够设置default-lazy-init="true",否则定时任务不触发,如果不明确指明default-lazy-init的值,默认是false。
           2、在<Beans>中不能够设置default-autowire="byName"的属性,否则后台会报org.springframework.beans.factory.BeanCreationException错误,这样就不能通过Bean名称自动注入,必须通过明确引用注入

Spring整合Quartz的更多相关文章

  1. 使用Spring整合Quartz轻松完成定时任务

    一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...

  2. spring整合quartz并持久化

    spring整合quartz有两种方式: 一.常见是使用配置文件,将定时任务保存到内存中 简单示例: <!-- 短信催还提醒任务调度 --> <bean id="overd ...

  3. Spring整合Quartz定时任务执行2次,Spring定时任务执行2次

    Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...

  4. spring整合quartz时间任务调度框架

    spring整合quartz框架 1.创建maven工程 2.导入jar包(pom.xml) <dependencies> <dependency> <groupId&g ...

  5. Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)

    Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境)   转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Q ...

  6. Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入

    Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入 Spring4整合quartz2.2.3中Job任务使用@Autowired不能注入 >> ...

  7. 使用spring整合Quartz实现—定时器

    使用spring整合Quartz实现—定时器(Maven项目做演示) 不基于特定的基类的方法 一,开发环境以及依赖的jar包 Spring 4.2.6.RELEASE Maven 3.3.9 Jdk ...

  8. Spring整合Quartz分布式调度

    前言 为了保证应用的高可用和高并发性,一般都会部署多个节点:对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调 ...

  9. Spring整合Quartz分布式调度(山东数漫江湖)

    前言 为了保证应用的高可用和高并发性,一般都会部署多个节点:对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调 ...

  10. 初识quartz 并分析 项目中spring整合quartz的配置【原创+转载】

    初识quartz 并分析 项目中spring整合quartz的配置[原创+转载]2018年01月29日 12:08:07 守望dfdfdf 阅读数:114 标签: quartz 更多个人分类: 工具 ...

随机推荐

  1. poj 2096 Collecting Bugs(期望 dp 概率 推导 分类讨论)

    Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other ...

  2. Chosen 基本使用

    点击下载Chosen 引入文件 chosen.css jquery-1.7.1.min.js chosen.jquery.js 绑定数据: for (var i = 0; i < data.le ...

  3. Direct3D 纹理映射

    纹理映射是将2D的图片映射到一个3D物体上面,物体上漂亮图案被称为纹理贴图, 一个表面可以支持多张贴图等等,下面简单介绍下纹理贴图 纹理贴图UV: 贴图是一个个像素点组成,每一个像素点都由一个坐标最后 ...

  4. pyqt一个简单的动画

    import sys from PyQt4.QtGui import QApplication , QGraphicsEllipseItem , QGraphicsItemAnimationfrom ...

  5. 45 个非常有用的 Oracle 查询语句(转)

    这里我们介绍的是 40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询.这些是所有 Oracle 开发者都必备的技能,所以快快收 ...

  6. 谈谈UIView的几个layout方法-layoutSubviews、layoutIfNeeded、setNeedsLayout...

    最近在学习swift做动画,用到constraint的动画,用到layoutIfNeeded就去研究了下UIView的这几个布局的方法. 下面是做得一个动画,下载地址:https://github.c ...

  7. samba服务器加入域控主机所需要修改的配置文件

    samba服务器加入域控主机,成为域成员,当用户访问samba服务器上的共享文件时,直接到域控主机上进行认证.samba服务器上不需要像先前一样创建系统用户,创建samba用户及密码. 1.安装环境( ...

  8. Flashback Recovery Area的设置与取消

    在Oracle 10g中, Flash back家族分为以下成员: Flashback Database, Flashback Drop,Flashback Query(分Flashback Quer ...

  9. Linux下安装软件的错误

    1. make configure GEN configure/bin/sh: 1: autoconf: not foundmake: *** [configure] Error 127 解决:sud ...

  10. jQuery validate 的valid()方法一直返回true

    1 调用$('#myForm').valid(),一直返回ture eg:html <form id="myForm"> <input class="f ...