
优点:与spring集成、动态添加任务、支持集群
缺点:不支持分布式(只能一个任务在一台服务器上执行,不能分片)
将一个任务拆分成多个独立的任务项,由分布式的服务器分别执行某一个或几个分片项。而传统的定时器任务都在一台服务器上执行,如果数据很大那么压力很大。
举例:处理一百万的订单:A服务器处理尾数偶数的订单,B服务器处理尾数奇数的订单。
整合java项目
1、引入quartz 依赖
2、quartzproperties
3、
注意:
1、每一个job执行都是一个新的线程(即使是同一个任务,这个elastic-job不同)但是如果在配置文件quartzproperties中配置的线程消耗完,也还是会陷入阻塞的。根据业务来预估线程池的大小。(所以的任务共享一个线程池)
2、每一个job执行都会创建一个新的job对象,所以想通过job的成员变量来传递信息是不可行的(每次都会初始化)
3、myJob类必须要有空的构造方法
1、方式1:在创建jobDetail是传递JobDataMap,然后通过JobExecutionContext获取JobDataMap
2、方式2:在myjob中定义成员变量,并生成get,set方法
上面我们知道任务间都是并发处理的,那么要考虑并发安全问题。
1、使用@DisallowConcurrentExecution
使用@PersistJobDataAfterExecution注解和jobDataMapput方法
1、startTime属性:设置trigger第一次触发的时间
2、endTime属性:表示trigger的失效时间点
3、优先级(priority)当多个Trigger并发执行,但是线程不够时触发,会优先执行级别高的Trigger
TriggerBuildernewTrigger()withPriority(10);
默认时5,数字越大优先级越高
4、错过触发(misfire instructions)
1、withMisfireHandlingInstructionDoNothing策略:错过了什么都不做,等待下一次触发时间
设置每5秒执行一次,任务7秒。
发现这样是不会生效的,因为内部判断了一下错过的时间是否大于misfireThreshold这个值(默认5秒),如果小于还是立即执行。这里我们只失效了2秒,是小于5秒的。
通过quartzproperties设置misfireThreshold的值
这样再运行,发现withMisfireHandlingInstructionDoNothing策略生效了。
2、withMisfireHandlingInstructionFireAndProceed策略:错过立即执行
5、日历(calendar)
1、可以在具体的时间点执行一次
2、可以按照指定间隔时间重复若干次
1、使用cron表达式触发
, 代表并且,如果10,20 10秒和20秒都指向
只能出现在日期和星期内,代表没有特定的值。如果使用号日期了星期会有歧义,这是使用
L 只能出现在日期和星期内,表示月的最后一天,或者星期六
W 只能出现在日期内,表示最接近这个日期的工作日
分布式任务调度框架几乎是每个大型应用必备的工具,本文介绍了任务调度框架使用的需求背景和痛点,对业界普遍使用的开源分布式任务调度框架的使用进行了探究实践,并分析了这几种框架的优劣势和对自身业务的思考。
一、业务背景
11 为什么需要使用定时任务调度
(1)时间驱动处理场景: 整点发送优惠券,每天更新收益,每天刷新标签数据和人群数据。
(2)批量处理数据: 按月批量统计报表数据,批量更新短信状态,实时性要求不高。
(3)异步执行解耦: 活动状态刷新,异步执行离线查询,与内部逻辑解耦。
12 使用需求和痛点
(1)任务执行监控告警能力。
(2)任务可灵活动态配置,无需重启。
(3)业务透明,低耦合,配置精简,开发方便。
(4)易测试。
(5)高可用,无单点故障。
(6)任务不可重复执行,防止逻辑异常。
(7)大任务的分发并行处理能力。
二、开源框架实践与 探索
21 Java 原生 Timer 和
ScheduledExecutorService
211 Timer使用
Timer缺陷:
由于上述缺陷,尽量不要使用Timer, idea中也会明确提示,使用ScheduledThreadPoolExecutor替代Timer 。
212 ScheduledExecutorService使用
ScheduledExecutorService对于Timer的缺陷进行了修补,首先ScheduledExecutorService内部实现是ScheduledThreadPool线程池,可以支持多个任务并发执行。
对于某一个线程执行的任务出现异常,也会处理,不会影响其他线程任务的执行,另外ScheduledExecutorService是基于时间间隔的延迟,执行不会由于系统时间的改变发生变化。
当然,ScheduledExecutorService也有自己的局限性:只能根据任务的延迟来进行调度,无法满足基于绝对时间和日历调度的需求。
22 Spring Task
221 Spring Task 使用
spring task 是spring自主开发的轻量级定时任务框架,不需要依赖其他额外的包,配置较为简单。
此处使用注解配置
222 Spring Task缺陷
Spring Task 本身不支持持久化,也没有推出官方的分布式集群模式,只能靠开发者在业务应用中自己手动扩展实现,无法满足可视化,易配置的需求。
23 永远经典的 Quartz
231 基本介绍
Quartz框架是Java领域最著名的开源任务调度工具,也是目前事实上的定时任务标准,几乎全部的开源定时任务框架都是基于Quartz核心调度构建而成。
232 原理解析
核心组件和架构
关键概念
(1) Scheduler :任务调度器,是执行任务调度的控制器。本质上是一个计划调度容器,注册了全部Trigger和对应的JobDetail, 使用线程池作为任务运行的基础组件,提高任务执行效率。
(2) Trigger :触发器,用于定义任务调度的时间规则,告诉任务调度器什么时候触发任务,其中CronTrigger是基于cron表达式构建的功能强大的触发器。
(3) Calendar :日历特定时间点的集合。一个trigger可以包含多个Calendar,可用于排除或包含某些时间点。
(4) JobDetail :是一个可执行的工作,用来描述Job实现类及其它相关的静态信息,如Job的名称、监听器等相关信息。
(5) Job :任务执行接口,只有一个execute方法,用于执行真正的业务逻辑。
(6) JobStore :任务存储方式,主要有RAMJobStore和JDBCJobStore,RAMJobStore是存储在JVM的内存中,有丢失和数量受限的风险,JDBCJobStore是将任务信息持久化到数据库中,支持集群。
233 实践说明
(1)关于Quartz的基本使用
(2)业务使用要满足动态修改和重启不丢失, 一般需要使用数据库进行保存。
(3)组件化
(4)扩展
234 缺陷和不足
(1)需要把任务信息持久化到业务数据表,和业务有耦合。
(2)调度逻辑和执行逻辑并存于同一个项目中,在机器性能固定的情况下,业务和调度之间不可避免地会相互影响。
(3)quartz集群模式下,是通过数据库独占锁来唯一获取任务,任务执行并没有实现完善的负载均衡机制。
24 轻量级神器 XXL-JOB
241 基本介绍
XXL-JOB是一个轻量级分布式任务调度平台,主打特点是平台化,易部署,开发迅速、学习简单、轻量级、易扩展,代码仍在持续更新中。
主要提供了任务的动态配置管理、任务监控和统计报表以及调度日志几大功能模块,支持多种运行模式和路由策略,可基于对应执行器机器集群数量进行简单分片数据处理。
242 原理解析
210版本前核心调度模块都是基于quartz框架,210版本开始自研调度组件,移除quartz依赖 ,使用时间轮调度。
243 实践说明
详细配置和介绍参考官方文档。
2431 demo使用:
@JobHandler(value="offlineTaskJobHandler") ,实现业务逻辑即可。(注:此次引入了dubbo,后文介绍)。
(滑动可查看)
示例2:分片广播任务。
(滑动可查看)
2432 整合dubbo
(1)引入dubbo-spring-boot-starter和业务facade jar包依赖。
(滑动可查看)
(2)配置文件加入dubbo消费端配置(可根据环境定义多个配置文件,通过profile切换)。
(滑动可查看)
(3)代码中通过@Reference注入facade接口即可。
(滑动可查看)
(4)启动程序加入@EnableDubboConfiguration注解。
(滑动可查看)
244 任务可视化配置
内置了平台项目,方便了开发者对任务的管理和执行日志的监控,并提供了一些便于测试的功能。
245 扩展
(1)任务监控和报表的优化。
(2)任务报警方式的扩展,比如加入告警中心,提供内部消息,短信告警。
(3)对实际业务内部执行出现异常情况下的不同监控告警和重试策略。
25 高可用 Elastic-Job
251 基本介绍
Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。
Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。
Elastic-Job-Cloud使用Mesos + Docker的解决方案,额外提供资源治理、应用分发以及进程隔离等服务。
可惜的是已经两年没有迭代更新记录。
252 原理解析
253 实践说明
2531 demo使用
(1)安装zookeeper,配置注册中心config,配置文件加入注册中心zk的配置。
(滑动可查看)
(滑动可查看)
(2)配置数据源config,并配置文件中加入数据源配置。
(滑动可查看)
(滑动可查看)
(3)配置事件config。
(滑动可查看)
(4)为了便于灵活配置不同的任务触发事件,加入ElasticSimpleJob注解。
(滑动可查看)
(5)对配置进行初始化。
(滑动可查看)
(6)实现 SimpleJob接口,按上文中方法整合dubbo, 完成业务逻辑。
(滑动可查看)
26 其余开源框架
(1) Saturn :Saturn是唯品会开源的一个分布式任务调度平台,在Elastic Job的基础上进行了改造。
(2) SIA-TASK :是宜信开源的分布式任务调度平台。
三、优劣势对比和业务场景适配思考
业务思考:
四、结语
对于并发场景不是特别高的系统来说,xxl-job配置部署简单易用,不需要引入多余的组件,同时提供了可视化的控制台,使用起来非常友好,是一个比较好的选择。希望直接利用开源分布式框架能力的系统,建议根据自身的情况来进行合适的选型。
附:参考文献
高可用架构
改变互联网的构建方式
quartz是定时调用的,是否你调用一次之后你的连接就关闭了,在hibernate里面如果你要直接 *** 作session的话可以用那个线程安全的session就是hibernateTemplategetSessionFactory()getCurrentSession()connection()方法获取的,这个session会自动管理的无须手动关闭。
以上就是关于定时器(quartz 一)全部的内容,包括:定时器(quartz 一)、分布式定时任务调度框架实践、如何在quartz中手动控制任务等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)