quartz与spring整合后,还是需要Scheduler实例、JobDetail实例、Trigger实例,只不过是用FactoryBean的方式创建了。

在spring-context-support-xxx.jar包中有对应的FactoryBean类,Scheduler实例对应org.springframework.scheduling.quartz.SchedulerFactoryBean。JobDetail实例对应两个FactoryBean类,org.springframework.scheduling.quartz.JobDetailFactoryBean和org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean。Trigger实例对应两个FactoryBean类,org.springframework.scheduling.quartz.SimpleTriggerFactoryBean和org.springframework.scheduling.quartz.CronTriggerFactoryBean,SimpleTriggerFactoryBean对应生成SimpleTrigger实例,CronTriggerFactoryBean对应生成CronTrigger实例。

用MethodInvokingJobDetailFactoryBean创建的JobDetail实例不能序列化,不适于任务调度信息持久化的情况,所以说如果要持久化任务调度信息的话,只能用JobDetailFactoryBean来创建JobDetail实例。

这几项对应的spring配置文件内容如下:

    <bean id="printJobDetail"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.kou.quartz.QuartzPrint"/>
<property name="durability" value="false"/>
</bean> <bean id="printCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="printJobDetail"/>
<property name="cronExpression" value="0/5 * * * * ? *"/> <!-- 每5秒触发一次 -->
</bean> <bean id="springBeanJobFactory" class="org.springframework.scheduling.quartz.SpringBeanJobFactory"/> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 指定quartz配置文件-->
<property name="configLocation" value="classpath:quartz.properties"/>
<!--QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动,单位秒 -->
<property name="startupDelay" value="30"/>
<!-- 设置自动启动 -->
<property name="autoStartup" value="true"/>
<property name="triggers">
<list>
<ref bean="printCronTrigger"/>
</list>
</property>
<property name="overwriteExistingJobs" value="true"/>
<!--<property name="dataSource" ref="dataSource"/>-->
<property name="jobFactory" ref="springBeanJobFactory"/>
</bean>

JobDetailFactoryBean的jobClass属性值就是我们自己开发的任务类,需要实现org.quartz.Job接口或者继承QuartzJobBean(全类名是org.springframework.scheduling.quartz.QuartzJobBean,也在spring-context-support-xxx.jar包),我们在execute()或executeInternal()方法中写自己的业务代码即可。

SchedulerFactoryBean的configLocation属性值就是上一篇《quartz入门》中介绍的quartz.properties配置文件,放在classpath下。

SchedulerFactoryBean的overwriteExistingJobs属性默认为false,当trigger由每5秒执行一次变为每30秒执行一次时,任务调度是不会更改的,只有设为true之后才会更改。

如果quartz.properties文件中有配置数据库信息的话(org.quartz.dataSource开头的一些配置),则SchedulerFactoryBean的dataSource属性可以不设置,否则要设置。

以上,定时任务就可以跑起来了。但是如果想在自定义的job中引用spring bean的话,会发现引不进来。还需要进行一些额外的操作:给scheduler设置jobFactory。如果我们不设的话,默认是AdaptableJobFactory实例。AdaptableJobFactory全类名是org.springframework.scheduling.quartz.AdaptableJobFactory。如果想在任务中引用spring的bean,我们可以利用其子类SpringBeanJobFactory,全类名是org.springframework.scheduling.quartz.SpringBeanJobFactory,这个类重写了父类的createJobInstance()方法。

如果不想用spring的配置文件,则也可以把这些配置信息转成代码:

@Configuration
public class Config { private static final Kconf<String> PRINT_JOB_CRON = Kconfs.ofString("young.admin.printJobCron", "0/30 * * * * ? *")
.build(); private static final Kconf<String> MMU_UPDATE_AUDIT_STATUS_JOB_CORN = Kconfs.ofString("young.admin.mmuUpdateAuditStatusJobCron", "0 0 2 * * ? *")
.build(); @Bean("printJobDetail")
public JobDetailFactoryBean getPrintJobDetail() {
JobDetailFactoryBean bean = new JobDetailFactoryBean();
bean.setJobClass(QuartzPrint.class);
bean.setDurability(true);
return bean;
} @Bean("printCronTrigger")
public CronTriggerFactoryBean getPrintCronTrigger(JobDetail printJobDetail) {
CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
bean.setCronExpression(PRINT_JOB_CRON.get());
bean.setJobDetail(printJobDetail);
return bean;
} @Bean("mmuUpdateAuditStatusJobDetail")
public JobDetailFactoryBean getMmuUpdateAuditStatusJobDetail() {
JobDetailFactoryBean bean = new JobDetailFactoryBean();
bean.setJobClass(MmuUpdateAuditStatusJob.class);
bean.setDurability(true);
return bean;
} @Bean("mmuUpdateAuditStatusCronTrigger")
public CronTriggerFactoryBean getMmuUpdateAuditStatusCronTrigger(JobDetail mmuUpdateAuditStatusJobDetail) {
CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
bean.setCronExpression(MMU_UPDATE_AUDIT_STATUS_JOB_CORN.get());
bean.setJobDetail(mmuUpdateAuditStatusJobDetail);
return bean;
} @Bean(name = "scheduler")
public SchedulerFactoryBean getScheduler(Trigger printCronTrigger, Trigger mmuUpdateAuditStatusCronTrigger) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 延时启动,应用启动10秒后
bean.setStartupDelay(10);
bean.setOverwriteExistingJobs(true);
bean.setConfigLocation(new ClassPathResource("quartz.properties"));
bean.setTriggers(printCronTrigger, mmuUpdateAuditStatusCronTrigger);
bean.setJobFactory(new SpringBeanJobFactory());
return bean;
} }

代码中的QuartzPrint、MmuUpdateAuditStatusJob都是集成QuartzJobBean的自定义类。

注意,trigger的cron表达式不要写死,要从配置文件或者从配置中心读取,这样,想更改调度规则的话,就不用改代码了,直接改配置项,然后重启服务器就好了。

quartz使用(整合spring)的更多相关文章

  1. 定时任务之Spring与Quartz的整合(有修改)

    转摘:http://www.javaweb1024.com/java/JavaWebzhongji/2015/04/13/548.html 在Spring中使用Quartz有两种方式实现:第一种是任务 ...

  2. quartz整合spring框架service层对象注入为null解决方案

    Job实现类代码 package cn.itcast.quartz; import org.quartz.Job; import org.quartz.JobExecutionContext; imp ...

  3. 整合SPRING CLOUD云服务架构 - 企业分布式微服务云架构构建

    整合SPRING CLOUD云服务架构 - 企业分布式微服务云架构构建 1.   介绍 Commonservice-system是一个大型分布式.微服务.面向企业的JavaEE体系快速研发平台,基于模 ...

  4. 【Java EE 学习 81】【CXF框架】【CXF整合Spring】

    一.CXF简介 CXF是Apache公司下的项目,CXF=Celtix+Xfire:它支持soap1.1.soap1.2,而且能够和spring进行快速无缝整合. 另外jax-ws是Sun公司发布的一 ...

  5. Mybatis整合Spring

    根据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持.因此由Mybatis社区自己开发了一个My ...

  6. mybatis入门_一对多,多对多映射以及整合spring框架

    一.一对多映射. 1.1 一对多映射之根据多的一方关联查询一的一方 示例:查询出具体的订单信息,同时也查询出来订单的用户信息. 引入的订单表如下所示: 框选出来的为具体的外键. 订单的Pojo类如下所 ...

  7. 《SSM框架搭建》三.整合spring web

    感谢学习http://blog.csdn.net/zhshulin/article/details/37956105#,还是修改了spring到最新的版本和接口开发示例 根据前一篇日志,已经有了myb ...

  8. Maven 整合 spring profile实现多环境自动切换

    Maven 整合 spring profile实现多环境自动切换 时间:2014-03-19 15:32来源:Internet 作者:Internet 点击:525次 profile主要用在项目多环境 ...

  9. TinyFrame续篇:整合Spring IOC实现依赖注入

    上一篇主要讲解了如何搭建基于CodeFirst的ORM,并且在章节末我们获取了上下文对象的实例:BookContext.这节主要承接上一篇,来讲解如何整合Spring IOC容器实现控制反转,依赖注入 ...

随机推荐

  1. 第18章-使用WebSocket和STOMP实现消息功能

    Spring 4.0为WebSocket通信提供了支持,包括: 发送和接收消息的低层级API: 发送和接收消息的高级API: 用来发送消息的模板: 支持SockJS,用来解决浏览器端.服务器以及代理不 ...

  2. c#缓存介绍

    #缓存介绍(转) 本章导读 缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大 ...

  3. 验证码-WebVcode

    验证码的实现 <img src="../Common/WebVcode.aspx" title="看不清?点此更换" alt="看不清?点此更换 ...

  4. 新的云主机 python 创建虚拟环境

    1.为什么要搭建虚拟环境? 问题:如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的版本, 其它的项目就无 ...

  5. android 多点触控

    多点触控 1.多点触控从字面意思讲就是你用大于等于2根的手指触摸子啊手机屏幕上. Android中监听触摸事件是onTouchEvent方法,它的参数为MotionEvent,下面列举MotionEv ...

  6. duilib入门简明教程 -- 响应按钮事件(4)

       上一个Hello World的教程里有一句代码是这样的:CControlUI *pWnd = new CButtonUI;     也就是说,其实那整块绿色背景区域都是按钮的区域.(这里简要介绍 ...

  7. C#上位机中ZedGraph控件的使用

    上位机程序控制PLC模拟量通道输出周期性正弦波信号,并采集所造成改变的模拟量输入信号,并绘制数据变化曲线. 界面如图: 最后测试效果如图: 代码: using System; using System ...

  8. sql server重建系统数据库

    方法一:https://bbs.csdn.net/topics/100013082 方法二:http://blog.51cto.com/jimshu/1095780 *** 方法三:https://b ...

  9. 使用 wget 下载需要 cookie 认证的网站

    .使用火狐,安装 Export Cookies 插件 2.登录网站,点菜单"工具-Export Cookies..",保存 cookies.txt 到自己的文件夹 3.把 cookies.t ...

  10. Mybatis-generator逆向工程

    $.Mybatis-generator介绍 MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器.它将为所有版本的MyBatis以及版本2.2.0之 ...