目录[-]

  • 一、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. Uiviewcontroller 控制器的生命周期

    这是一个ViewController完整的声明周期,其实里面还有好多地方需要我们注意一下: 1:initialize函数并不会每次创建对象都调用,只有在这个类第一次创建对象时才会调用,做一些类的准备工 ...

  2. IOS 监听通讯录是否改变

    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); ABAddressBookRegist ...

  3. C语言获取系统当前时间转化成时间字符串

    因为保存的文件须要加上保存的时间,所以须要一个函数来将系统当前时间获取出来,同一时候转换成时间字符串.详细的时间代码例如以下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  4. poj 1523 SPF(tarjan求割点)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  5. Android应用程序注冊广播接收器(registerReceiver)的过程分析

    前面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/公布机制,因此,使用这样的消息驱动模型的第一步便是订阅消息:而对Android应用程序来说,订阅消息事实上就是注冊广播接收器, ...

  6. boost库在工作(39)网络UDP异步服务端之九

    前面创建的UDP服务器和客户端,都是同步的方式,也就是说当接收数据时,不能参与别的事情执行的.如果在一个只有界面线程的程序里,又不想创建多线程,导致复杂程度的增加,在这种情况之下,我们还有一个方案可以 ...

  7. MySql命令——show,分页,正则表达式

    先要安装MySql,过程见 MySql5.1在Win7下的安装与重装问题的解决 不是教程,还没有写教程的资格,只是为了自己查阅而已!   show show databases; //显示所有数据库 ...

  8. Git新建本地分支与远程分支关联问题:git branch --set-upstream

    Git新建本地分支与远程分支关联问题:git branch --set-upstream git在本地新建分支, push到remote服务器上之后,再次pull下来的时候,如果不做处理会报以下提示: ...

  9. SqlServer存储过程传入Table参数

    今天是周日,刚好有空闲时间整理一下这些天工作业务中遇到的问题. 有时候我们有这样一个需求,就是在后台中传过来一个IList<类>的泛型集合数据,该集合是某个类的实例集合体,然后将该集合中的 ...

  10. virtual box 改变已经创建的虚拟系统分配的硬盘

    启动cmd,进入virtualbox安装的目录 :cd E:\Program Files\Oracle\VirtualBox 然后输入VBoxManage.exe list hdds ,可以看到 D: ...