【Quartz学习总结】——与spring整合
2017-11-08 11:08
369 查看
一、什么是Quartz?
Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作.
二、Quartz能干什么/应用场景
如网页游戏中挂机自动修炼如8个小时,人物相关数值进行成长,当使用某道具后,时间减少到4个小时,人物对应获得成长值.这其中就 涉及到了Scheduler的操作,定时对人物进行更新属性操作,更改定时任务执行时间.
网页游戏中会大量涉及到Scheduler的操作,有兴趣的朋友可自行联想.
企业中如每天凌晨2点触发数据同步、发送Email等操作
三、核心接口
Scheduler——核心调度器
Job——任务
JobDetai——任务描述
Trigger——触发器
四、Maven引入依赖jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.0.6.RELEASE</version>
</dependency>
这个包的作用是什么呢?这个jar 文件包含支持UI模版(Velocity,FreeMarker,JasperReports),邮件服务,脚本服务(JRuby),缓存Cache(EHCache),任务计划Scheduling(uartz)方面的类。
外部依赖spring-context, (spring-jdbc, Velocity, FreeMarker, JasperReports, BSH, Groovy, JRuby, Quartz, EHCache)
五、编写Job代码
package cn.itcast.quartz;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
*
*
*/
public class MyJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("myJob 执行了............." + context.getTrigger().getKey().getName());
ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().getJobDataMap()
.get("applicationContext");
System.out.println("获取到的Spring容器是: " + applicationContext);
}
}
和入门程序对比,这个job中的代码显然少了很多,其中我们需要关注的一点就是,我们继承了一个QuartzJobBean,这个是spring 给我提供的包中的一个类,我们只需要重写里面的一个executeInternal即可。
六、CronTrigger 表达式自动生成插件下载地址为:
http://download.csdn.net/download/dc2222333/10108996CronTrigger
,表达式的编写学习请点击链接查看点击打开链接
七、spirng配置文件的编写
<!-- 定义任务bean -->
<bean name="myJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 指定具体的job类 -->
<property name="jobClass" value="cn.itcast.quartz.MyJob" />
<!-- 指定job的名称 -->
<property name="name" value="myJob" />
<!-- 指定job的分组 -->
<property name="group" value="jobs" />
<!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务 -->
<property name="durability" value="true"/>
<!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 -->
<property name="applicationContextJobDataKey" value="applicationContext"/>
</bean>
<!-- 定义触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myJobDetail" />
<!-- 每一分钟执行一次 -->
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
<!-- 定义触发器 -->
<!-- 演示:一个job可以有多个trigger; -->
<!-- <bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myJobDetail" />
每一分钟执行一次
<property name="cronExpression" value="0 */1 * * * ?" />
</bean> -->
<!-- 定义调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
<!-- <ref bean="cronTrigger2" /> -->
</list>
</property>
</bean>
小结 这个时候只要我们启动spring容器后,定时任务就是按照我们编写的频率和job自动执行。
当我们和spring进行整合以后,我们的开发变得非常的简单,但是这里有两个问题:
一个job能否多个trigger? 可以
在上面代码中我们已经进行了测试,同时将一个job添加到多个trigger中是没有问题的,代码如上。
一个trigger能否多个job? 不可以
Quartz是一个开源的作业调度框架,由java编写,在.NET平台为Quartz.Net,通过Quart可以快速完成任务调度的工作.
二、Quartz能干什么/应用场景
如网页游戏中挂机自动修炼如8个小时,人物相关数值进行成长,当使用某道具后,时间减少到4个小时,人物对应获得成长值.这其中就 涉及到了Scheduler的操作,定时对人物进行更新属性操作,更改定时任务执行时间.
网页游戏中会大量涉及到Scheduler的操作,有兴趣的朋友可自行联想.
企业中如每天凌晨2点触发数据同步、发送Email等操作
三、核心接口
Scheduler——核心调度器
Job——任务
JobDetai——任务描述
Trigger——触发器
四、Maven引入依赖jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.0.6.RELEASE</version>
</dependency>
这个包的作用是什么呢?这个jar 文件包含支持UI模版(Velocity,FreeMarker,JasperReports),邮件服务,脚本服务(JRuby),缓存Cache(EHCache),任务计划Scheduling(uartz)方面的类。
外部依赖spring-context, (spring-jdbc, Velocity, FreeMarker, JasperReports, BSH, Groovy, JRuby, Quartz, EHCache)
五、编写Job代码
package cn.itcast.quartz;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
*
*
*/
public class MyJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("myJob 执行了............." + context.getTrigger().getKey().getName());
ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().getJobDataMap()
.get("applicationContext");
System.out.println("获取到的Spring容器是: " + applicationContext);
}
}
和入门程序对比,这个job中的代码显然少了很多,其中我们需要关注的一点就是,我们继承了一个QuartzJobBean,这个是spring 给我提供的包中的一个类,我们只需要重写里面的一个executeInternal即可。
六、CronTrigger 表达式自动生成插件下载地址为:
http://download.csdn.net/download/dc2222333/10108996CronTrigger
,表达式的编写学习请点击链接查看点击打开链接
七、spirng配置文件的编写
<!-- 定义任务bean -->
<bean name="myJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 指定具体的job类 -->
<property name="jobClass" value="cn.itcast.quartz.MyJob" />
<!-- 指定job的名称 -->
<property name="name" value="myJob" />
<!-- 指定job的分组 -->
<property name="group" value="jobs" />
<!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务 -->
<property name="durability" value="true"/>
<!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 -->
<property name="applicationContextJobDataKey" value="applicationContext"/>
</bean>
<!-- 定义触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myJobDetail" />
<!-- 每一分钟执行一次 -->
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
<!-- 定义触发器 -->
<!-- 演示:一个job可以有多个trigger; -->
<!-- <bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myJobDetail" />
每一分钟执行一次
<property name="cronExpression" value="0 */1 * * * ?" />
</bean> -->
<!-- 定义调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
<!-- <ref bean="cronTrigger2" /> -->
</list>
</property>
</bean>
小结 这个时候只要我们启动spring容器后,定时任务就是按照我们编写的频率和job自动执行。
当我们和spring进行整合以后,我们的开发变得非常的简单,但是这里有两个问题:
一个job能否多个trigger? 可以
在上面代码中我们已经进行了测试,同时将一个job添加到多个trigger中是没有问题的,代码如上。
一个trigger能否多个job? 不可以
相关文章推荐
- Spring学习总结8(整合Hibernate)
- Spring Boot学习总结(2)——Spring Boot整合Jsp
- Quartz学习--Spring整合Quartz(MethodInvokingJobDetailFactoryBean方式)
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
- spring quartz学习总结: cluster的配置和示例
- MyBatis学习总结——Mybatis3.x与Spring4.x整合
- MyBatis学习总结--Mybatis3.x与Spring4.x整合
- 工作流Activiti的学习总结(四)Spring和Activiti的整合配置讲解
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
- Spring Boot学习总结(2)——Spring Boot整合Jsp
- Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
- spring学习笔记spring整合Quartz持久化稳健任务调度(2)
- Quartz学习(七)--Spring整合Quartz(MethodInvokingJobDetailFactoryBean方式)
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
- spring学习笔记(26)spring整合Quartz2持久化稳健任务调度
- 工作流Activiti的学习总结(十一)Activiti5.6和Spring3.03整合
- RabbitMQ学习总结(7)——Spring整合RabbitMQ实例
- MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合
- RabbitMQ学习总结(7)——Spring整合RabbitMQ实例