目录[-]

  • 一、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. Android使用bindService启动服务

    1.Service package com.example.ebobo; import java.util.Timer; import java.util.TimerTask; import andr ...

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

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

  3. qt简单界面更新代码(菜鸟级)(部分代码)

    qt简单界面更新代码(菜鸟级)(部分代码)self.timers_1=QtCore.QTimer(self)self.timers_1.timeout.connect(self.min_1)self. ...

  4. 利用PHPExcel转Excel柱形图

    这在附还有一个转柱形图的效果及代码. 原PHP报表效果: 转成Excel后的效果: 附上代码: <? php /** * PHPExcel * * Copyright (C) 2006 - 20 ...

  5. 大到可以小说的Y组合子(三)

    答:关于Fix的问题你fix了吗? 问:慢着,让我想想,上次留下个什么问题来着?是说我们有了一个求不动点的函数Fix,但Fix却是显式递归的,是吧? 答:有劳你还记的这个问题. 问:Fix的参与背离了 ...

  6. Chrome开发者工具详解(1):Elements、Console、Sources面板

    Chrome开发者工具面板 面板上包含了Elements面板.Console面板.Sources面板.Network面板. Timeline面板.Profiles面板.Application面板.Se ...

  7. 1203.3——循环语句 之 while

    while循环 while循环的一般形式为:    while(表达式){        语句块    }其中表达式称为循环条件,语句块称为循环体. while语句的意思是:先计算表达式的值,当值为真 ...

  8. Python3.5入门学习记录-模块

    模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用. 简单地说,模块就是一个保存了 ...

  9. Webform Lable

  10. CISC + RISC = Y86

    最近在读深入理解计算机系统,打算把读时的心得放上来 Y86有着CISC和RISC的属性Y86可以看成是CISC(IA32),但用RISC的原理简化了 CISC和RISC的竞争引发了许多争论CISC和R ...