首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于SpringBoot&Quartz分布式多节点负载持久化

在上一章【

基于SpringBoot & Quartz分布式单节点持久化

】中我们已经完成了任务的持久化,当我们创建一个任务时任务会被 定时任务框架自动持久化到数据库,我们采用的是 项目托管的 来完成的数据源提供,当然也可以使用 内部配置数据源方式,我们的标题既然是提到了定时任务的分布式多节点,那么怎么才算是多节点呢?当有节点故障或者手动停止运行后是否可以自动漂移任务到可用的分布式节点呢?

本章目标

完成定时任务分布式多节点配置,当单个节点关闭时其他节点自动接管定时任务。

创建任务时传递自定义参数,方便任务处理后续业务逻辑。

恒宇少年的SpringBoot简书企业级核心技术学习专题推荐

构建项目

注意:我们本章项目需要结合上一章共同完成,有一点要注意的是任务在持久化到数据库内时会保存任务的全路径,如: , 在运行任务时会根据任务全路径去执行,如果不一致则会提示找不到指定类,我们本章在创建项目时 需要跟上一章完全一致。

我们这里就不去直接创建新项目了,直接复制上一章项目的源码为新的项目命名为

配置分布式

在上一章配置文件 中我们其实已经为分布式做好了相关配置,下面我们就来看一下分布式相关的配置。 分布式相关配置:

: 定时任务的实例编号,如果手动指定需要保证每个节点的唯一性,因为 不允许出现两个相同 的节点,我们这里指定为 就可以了,我们把生成编号的任务交给 。

: 这个属性才是真正的开启了定时任务的分布式配置,当我们配置为 时 框架就会调用 来初始化分布式节点。

:配置了分布式节点的检查时间间隔,单位:毫秒。 下面是 配置文件配置信息:

当我们启动任务节点时,会根据 属性配置进行是否自动加载任务,默认 自动加载数据库内的任务到节点。

测试分布式

上一章项目节点名称: 本章项目节点名称:

由于我们 的商品库存检查定时任务是每隔30秒执行一次,所以任务除非手动清除否则是不会被清空的,在运行项目测试之前需要将 配置文件的端口号、项目名称修改下,保证 与 端口号不一致,可以同时运行,修改后为:

然后修改相应控制台输出,为了能够区分任务执行者是具体的节点。

下面我们启动本章项目,查看控制台输出内容,如下所示:

可以看到项目启动完成后自动分配的 为 ,生成的规则是当前用户的名称+时间戳。然后 分布式管理者自动介入进行扫描是否存在匹配的触发器任务,如果存在则会自动执行任务逻辑,而商品库存检查定时任务确实由 进行输出的。

测试任务自动漂移

下面我们也需要把 的输出进行修改,如下所示:

接下来我们启动 ,并查看控制台的输出内容:

项目启动完成后,定时节点并没有实例化 来完成分布式节点的初始化,因为 检测到有其他的节点正在处理任务,这样也是保证了任务执行的唯一性。

关闭quartz-cluster-node-second

我们关闭 运行的项目,预计的目的可以达到 会自动接管数据库内的任务,完成任务执行的自动漂移,我们来查看 的控制台输出内容:

控制台已经输出了持久的定时任务,输出节点是 ,跟我们预计的一样,节点 完成了自动接管 的工作,而这个过程肯定有一段时间间隔,而这个间隔可以修改 配置文件内的属性 进行调节。

关闭quartz-cluster-node-first

我们同样可以测试启动任务节点 后,再关闭 任务节点,查看 控制台的输出内容:

得到的结果是同样可以完成任务的自动漂移。

如果两个节点同时启动,哪个节点先把节点信息注册到数据库就获得了优先执行权。

传递参数到任务

我们平时在使用任务时,如果是针对性比较强的业务逻辑,肯定需要特定的参数来完成业务逻辑的实现。

下面我们来模拟商品秒杀的场景,当我们添加商品后自动添加一个商品提前五分钟的秒杀提醒,为关注该商品的用户发送提醒消息。 我们在节点 中添加秒杀提醒任务,如下所示:

在秒杀提醒任务逻辑中,我们通过获取 的 集合来获取在创建任务的时候传递的参数集合,我们这里约定了 为商品的编号,在创建任务的时候传递到 内,这样 在执行该任务的时候就会自动将参数传递到任务逻辑中,我们也就可以通过 获取到对应的参数值。

设置秒杀提醒任务

我们找到节点项目 中的 ,编写方法 设置秒杀提醒任务,如下所示:

我们模拟秒杀提醒时间是添加商品后的5分钟,我们通过调用 实例的 方法就可以获取该任务数据集合,直接调用 方法就可以进行设置指定key的值,该集合继承了 并且实现了 序列化,因为需要将数据序列化到数据库的 表内。 修改保存商品方法,添加调用秒杀提醒任务:

添加测试商品

下面我们调用节点 的测试 方法完成商品的添加,由于我们的 项目并没有停止,所以我们在 项目的控制台查看输出内容:

秒杀任务在添加完成商品后的五分钟开始执行的,而我们也正常的输出了传递过去的 商品编号的参数,而秒杀提醒任务执行一次后也被自动释放了。

总结

本章主要是结合上一章完成了分布式任务的讲解,完成了测试持久化的定时任务自动漂移,以及如何向定时任务传递参数。当然在实际的开发过程中,任务创建是需要进行封装的,目的也是为了减少一些冗余代码以及方面后期统一维护定时任务。

本章源码已经上传到码云: SpringBoot配套源码地址:https://gitee.com/hengboy/spring-boot-chapter SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter SpringBoot相关系列文章请访问:目录:SpringBoot学习目录 QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录 SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录 SpringBoot相关文章请访问:目录:SpringBoot学习目录,感谢阅读!

加入知识星球,恒宇少年带你走以后的技术道路!!!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180706G08B6L00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券