一、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)

package org.crazyit.hrsystem.schedule;

import java.util.Date;

import org.springframework.scheduling.quartz.QuartzJobBean;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.crazyit.hrsystem.service.EmpManager;

public class PunchJob

extends QuartzJobBean

{

//判断作业是否执行的旗标

private boolean isRunning = false;

//该作业类所依赖的业务逻辑组件

private EmpManager empMgr;

public void setEmpMgr(EmpManager empMgr)

{

this.empMgr = empMgr;

}

//定义任务执行体

public void executeInternal(JobExecutionContext ctx)

throws JobExecutionException

{

if (!isRunning)

{

System.out.println("开始调度自动打卡");

isRunning = true;

//调用业务逻辑方法

empMgr.autoPunch();

isRunning = false;

}

}

}

3、编写quartz.xml配置文件

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"

default-lazy-init="false">

class="org.crazyit.hrsystem.service.impl.EmpManagerImpl"

parent="managerTemplate"/>

class="org.springframework.scheduling.quartz.CronTriggerBean">

class="org.springframework.scheduling.quartz.JobDetailBean">

value="org.crazyit.hrsystem.schedule.PunchJob"/>

value="0 0 7,12 ? * MON-FRI"/>

class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

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

java.lang.NullPointerException错误,主要是因为没有注入Bean。

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

class="org.springframework.scheduling.quartz.JobDetailBean">

com.gresoft.fileupload.service.ParseFileQuartz

class="org.springframework.scheduling.quartz.CronTriggerBean">

0/30 * * * * ?

4、让容器加载quartz.xml

在web.xml中添加:

contextConfigLocation

/WEB-INF/applicationContext.xml,/WEB-INF/quartz.xml

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

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

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

# 配置主调度器属性

org.quartz.scheduler.instanceName = QuartzScheduler

org.quartz.scheduler.instanceId  = AUTO

# 配置线程池

# Quartz线程池的实现类

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

# 线程池的线程数量

org.quartz.threadPool.threadCount = 1

# 线程池里线程的优先级

org.quartz.threadPool.threadPriority = 10

# 配置作业存储

org.quartz.jobStore.misfireThreshold = 60000

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

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

三、注意事项

在Spring配置和Quartz集成内容时,有两点需要注意

1、在中不能够设置default-lazy-init="true",否则定时任务不触发,如果不明确指明default-lazy-init的值,默认是false。

2、在中不能够设置default-autowire="byName"的属性,否则后台会报org.springframework.beans.factory.BeanCreationException错误,这样就不能通过Bean名称自动注入,必须通过明确引用注入

java jobdetail_Spring创建JobDetail的两种方式相关推荐

  1. Java中创建String的两种方式差异

    我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd"; String str2 = new String("abcd&qu ...

  2. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  3. java匿名启动线程_使用匿名内部类:来创建线程的两种方式

    [Java]基础31:创建线程的两种方式 谢谢你的观看. 今天是我自学Java的第31天. 你的观看便是对我最大的鼓励. 话不多说,开始今天的学习: 线程的创建有两种方式,昨天学习过其中的一种: 创建 ...

  4. java创建线程的两种方式及区别

    本文将介绍创建线程的两种方式,示例代码在下面,复制粘贴即可 继承Thread类方式和实现Runnable接口方式 区别:由于在开发的过程中,很多的类都会用到继承的方式,如果采用继承的方式会让各个类之间 ...

  5. 【并发技术01】传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承 Thread 类,并重写 run() 方法:二是实现 Runnable 接口,覆盖接口中的 run() 方法,并把 Runnable 接口的实现扔给 T ...

  6. Java中HashMap遍历的两种方式

    第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...

  7. ubuntu下创建定时任务的两种方式及常见问题解决方案

    ubuntu下创建定时任务的两种方式及常见问题解决方案 参考文章: (1)ubuntu下创建定时任务的两种方式及常见问题解决方案 (2)https://www.cnblogs.com/maboii/p ...

  8. ubuntu创建用户的两种方式

    ubuntu创建用户有两种方式: useradd和adduser 这两者,就像零件与产品的关系.useradd是DIY,需要自己调配,adduser是品牌机,拿来就能用. 对于创建一般用户来讲,use ...

  9. PyCharm创建app的两种方式

    PyCharm创建app的两种方式 方式1 1-1 在terminal中敲如下代码 python manage.py startapp xxx 1-2 在settings.py中INSTALLED_A ...

最新文章

  1. python不用编译吗_windows编译xgboost-python,不用vs编译
  2. 做ML项目,任务繁多琐碎怎么办?这份自查清单帮你理清思路
  3. Ajax基础和Json基础
  4. java 其他文件转pdf_java 其他文件转成pdf java生成pdf
  5. 北航计算机学院有河南的,北航计划在豫招生165人 河南多所高职公布预录名单...
  6. SQL Server大量数据秒级插入/新增/删除
  7. 理解PHP5中static和const关键字
  8. [Maven问题总结]Maven+Tomcat7
  9. Ubuntu配置教程
  10. vector向量容器的一些基本操作
  11. Atitit 项目wechat微信截屏生成vcf通讯录384 个 384个人 42个节拍,平均每个8个人 技术点 im图像裁剪, ocr Tesseract Vcf格式 /wechatTel
  12. FPGA SPI协议
  13. android 开门动画,Android之高仿微信“开门动画”(六)
  14. Markdown语法中使用表情符号
  15. 一名淘宝店长运营店铺靠谱指南
  16. 【MC-CNN论文翻译】Computing the Stereo Matching Cost with a Convolutional Neural Network
  17. CF Buns (01背包问题)
  18. ATeam社区(牛客网项目第七章)
  19. 小白学习Basemap气象画地图的第五天(读取micaps站点数据,省级能见度分布)
  20. 传说对决服务器无响应怎么办,传说对决一直进不去怎么办

热门文章

  1. 手机促销活动页面怎么设计?有了全面的模板,简单了
  2. python的random模块怎么写_Python常用标准库之random模块
  3. numpy 矩阵乘法_NumPy 运算规则总结
  4. CUDA编程之:cudaMemcpy()函数
  5. 在CentOS上进行虚拟化:QEMU、Xen、KVM、LibVirt、oVirt
  6. greenplum mysql jdbc_Kylin设置JDBC配置greenplum数据源
  7. sklearn之Multioutput 估计器
  8. android的蓝牙和数据库的开源项目地址
  9. Idea集成springboot报错(cound not autowire)
  10. python 状态机第三方库_Python 状态机 - osc_8g11urw7的个人空间 - OSCHINA - 中文开源技术交流社区...