Spring 整合 Quartz 分布式调度
转载自 Spring 整合 Quartz 分布式调度
本文旨在对 Spring+Quartz 分布式调度有一个直观的了解,通过实际的使用来解决问题。
前言
为了保证应用的高可用和高并发性,一般都会部署多个节点;对于定时任务,如果每个节点都执行自己的定时任务,一方面耗费了系统资源,另一方面有些任务多次执行,可能引发应用逻辑问题,所以需要一个分布式的调度系统,来协调每个节点执行定时任务。
Spring 整合 Quartz
Quartz是一个成熟的任务调度系统,Spring对Quartz做了兼容,方便开发,下面看看具体如何整合:
1.Maven依赖文件
主要就是Spring相关库、quartz库以及mysql驱动库,注:分布式调度需要用到数据库,这里选用mysql;
2.配置job
提供了两种方式来配置job,分别是:MethodInvokingJobDetailFactoryBean和JobDetailFactoryBean
2.1MethodInvokingJobDetailFactoryBean
要调用特定bean的一个方法的时候使用,具体配置如下:
2.2JobDetailFactoryBean
这种方式更加灵活,可以设置传递参数,具体如下:
jobClass定义的任务类,继承QuartzJobBean,实现executeInternal方法;jobDataMap用来给job传递数据;
3.配置调度使用的触发器
同样提供了两种触发器类型:SimpleTriggerFactoryBean和CronTriggerFactoryBean
重点看CronTriggerFactoryBean,这种类型更加灵活,具体如下:
jobDetail指定的就是在步骤2中配置的job,cronExpression配置了每5秒执行一次job;
4.配置Quartz调度器的SchedulerFactoryBean
同样提供了两种方式:内存RAMJobStore和数据库方式
4.1内存RAMJobStore
job的相关信息存储在内存里,每个节点存储各自的,互相隔离,配置如下:
4.2数据库方式
job的相关信息存储在数据库中,所有节点共用数据库,每个节点通过数据库来通信,保证一个job同一时间只会在一个节点上执行,并且如果某个节点挂掉,job会被分配到其他节点执行,具体配置如下:
dataSource用来配置数据源,数据表相关信息,可以到官网下载gz包,sql文件在路径:docs\dbTables下,里面提供了主流数据库的sql文件,总共11张表;
configLocation配置的quartz.properties文件在quartz.jar的org.quartz包下,里面提供了一些默认的数据,比如org.quartz.jobStore.class
这里需要将quartz.properties拷贝出来做一些修改,具体修改如下:
5.相关类
FirstTask继承QuartzJobBean,实现executeInternal方法,调用FirstService;
public class FirstService implements Serializable {
private static final long serialVersionUID = 1L;
public void service() {
System.out.println(new SimpleDateFormat("YYYYMMdd HH:mm:ss").format(new Date()) + "---start FirstService");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(new SimpleDateFormat("YYYYMMdd HH:mm:ss").format(new Date()) + "---end FirstService");
}
}
FirstService需要提供序列化接口,因为需要保存在数据库中;
主类用来加载quartz配置文件;
测试分布式调度
1.同时启动App两次,观察日志:
其中A1有日志输出,A2没有;当停掉A1以后,A2有日志输出;
2.添加新的job分别新建:SecondTask和SecondService,同时添加相关配置文件,启动App观察日志:
A1日志如下:
A2日志如下:
可以发现A1和A2都有执行任务,但是同一任务同一时间只会在一个节点执行,并且只有在执行结束后才有可能分配到其他节点;
3.如果间隔时间小于任务执行时间,比如这里改成sleep(6000)
A1日志如下:
A2日志如下:
间隔时间是5秒,而任务执行需要6秒,观察日志可以发现,任务还没有结束,新的任务已经开始,这种情况可能引发应用的逻辑问题,其实就是任务能不能支持串行的问题;
4.@DisallowConcurrentExecution注解保证任务的串行
在FirstTask和SecondTask上分别添加@DisallowConcurrentExecution注解,日志结果如下:
A1日志如下:
A2日志如下:
观察日志可以发现,任务只有在end以后,才会开始新的任务,实现了任务的串行化;
总结
本文旨在对Spring+Quartz分布式调度有一个直观的了解,通过实际的使用来解决问题,当然可能还有很多疑问比如它是如何调度的,数据库如果挂了会怎么样等等,还需要做更加深入的了解。
Spring 整合 Quartz 分布式调度相关推荐
- Spring整合Quartz集群部署
Spring整合Quartz集群部署 Quartz的分布式模式 数据表创建 quartz.properties spring-job.xml Quartz的分布式模式 集群中的每个节点都是一个独立的Q ...
- 使用Spring整合Quartz轻松完成定时任务
一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...
- spring整合quartz框架
前言: 在一些项目中,往往需要定时的去执行一些任务,比如商城项目,每天0点去统计前一天的销量.那么如何实现呢,总不可能我们每天0点手动的去执行统计销量的方法吧,这时就quartz就起作用了. quar ...
- Spring整合Quartz定时发送邮件
功能描述:刚开始接触Quartz,试着用Quartz整合spring实现每隔一分钟发送一封邮件连续发送10次核心jar:邮件发送:commons-email-1.2.jar mail.jar(必须的) ...
- Spring整合Quartz实现定时任务
Quartz框架是一个极其成功的开源任务调度框架,目前很多公司在实现任务调度上都直接使用或在借鉴的基础上实现了自己的任务调度框架,Quartz使用Trigger,Job和JobDetail对象实现调度 ...
- spring整合quartz框架定时任务实战
Spring整合定时任务调度框架Quartz实战 2014-09-12 11:51 9707人阅读 评论(6) 收藏 举报 分类: [综合问题](74) 版权声明:本文为博主原创文章,未经博主允许 ...
- java 定时任务插件_详解Spring整合Quartz实现动态定时任务
最近项目中需要用到定时任务的功能,虽然spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...
- Spring整合Quartz实现持久化、动态设定时间
一.spring整合 网上一搜有很多整合的方式,这里我采用了其中的一种(暂时还没有对其他的方法研究过). 对于spring的整合其中的任务,spring提供了几个类.接口(这些类都实现了Job接口): ...
- Spring 整合Quartz 2实现定时任务五:集群、分布式架构实现探讨
到这里,功能上我们已经全实现了. 但是有时候我们的项目不是部署在一台机器上的,而是一个集群环境,往往我们的定时任务只需要一台机器执行就够了. 那么我们怎么样来实现这种集群环境下的定时任务运行呢? 前面 ...
最新文章
- 2018-03-02 Linux
- Manjaro开机黑屏卡住_显卡驱动问题解决及配置源和搜狗输入法安装。
- docker commit 发布自己的镜像
- Linux添加网站后无法显示,Linux:SElinux导致网站无法访问
- Python中的xxx+=xxx和xxx=xxx+xxx一些区别及执行过程
- for循环false 终止 python_python3.5.1给用户3次无效的尝试,然后终止pgm(Simple FOR循环)...
- 人工智能目标检测模型总结(二)——目标检测two-stage模型汇总
- php中怎么创建对象,php创建对象有哪几种方法
- UGUI直接修改Image的Color和用unity自带的UI Shadr修改_Color属性的区别
- 【android自定义控件】button样式自定义二
- 【Java思维导图】
- 国内外计算机CPU差异,Intel 9代和10代CPU差别真的很大?配电脑看它选择不后悔
- 【内存】UDIMM、RDIMM、SODIMM以及LRDIMM的区别
- BBED处理RMAN-03009,ORA-1956
- Matlab实现图像阈值分割
- 【Linux】linux中的strip命令
- Display tag 使用
- 学习过程中量变引起质变的原理
- 老男孩培训 | 0基础五个月,让我收获了满意的工作和生活!
- Mimikatz Windows、Linux基本使用
热门文章
- 高等数学下-赵立军-北京大学出版社-题解-练习10.3
- statusbar 尺寸 显示图标_移动端页面设计规范尺寸大起底 - 椰树飘香
- java的hr样式,spring+spring mvc+mybatis开发java医院HR人事管理系统(加强版本+ shiro)...
- matlab处理中文路径
- DijKstra算法普通+堆优化链式向前星
- CF1547F Array Stabilization (GCD version) st表 + 尺取/二分
- P3527 [POI2011]MET-Meteors 整体二分 + 树状数组
- Intervals on the Ring
- 2017 ICPC沈阳区域赛
- HAPPY2020暑假训练前复习