上一篇,我们介绍了如何使用Elastic Job实现定时任务(https://blog.didispace.com/spring-boot-learning-2-7-2/)。解决了使用@Scheduled来实现时候存在的竞争问题,同时也实现了定时任务的高可用执行。

然而,还有一类问题是我们在做定时任务时候容易出现的,就是任务执行速度时间过长;同时,为了实现定时任务的高可用,还启动了很多任务实例,但每个任务执行时候就一个实例在跑,资源利用率不高。

所以,接下来我们就来继续介绍,使用Elastic Job的分片配置,来为任务执行加加速,资源利用抬抬高的目标!

动手试试

建议直接下载文末仓库中的chapter7-2工程,然后在这个基础上进行修改。当然,如果你对如何使用Elastic Job还不输入,那么先前往上一篇做个知识铺垫,再继续下面的内容!

第一步:创建一个分片执行的任务

@Slf4j
@Service
public class MyShardingJob implements SimpleJob {@Overridepublic void execute(ShardingContext context) {switch (context.getShardingItem()) {case 0:log.info("分片1:执行任务");break;case 1:log.info("分片2:执行任务");break;case 2:log.info("分片3:执行任务");break;}}}

这里通过switch来判断当前任务上下文的sharding-item值来执行不同的分片任务。sharding-item的值取决于后面将要配置的分片总数,但注意是从0开始计数的。这里仅采用了日志打印的方式,来展示分片效果,真正实现业务逻辑的时候,一定记得根据分片数量对执行任务也要做分片操作的设计。比如:你可以根据批量任务的id求摩的方式来区分不同分片处理不同的数据,以避免又重复执行而出现问题。

第二步:在配置文件中,设置配置任务的实现类、执行表达式、以及将要重要测试的分片总数参数

elasticjob.jobs.my-sharding-job.elastic-job-class=com.didispace.chapter73.MyShardingJob
elasticjob.jobs.my-sharding-job.cron=0/5 * * * * ?
elasticjob.jobs.my-sharding-job.sharding-total-count=3

这里设置为3,所以任务会被分为3个分片,每个分片对应第一步中一个switch的分支。

运行与测试

单实例运行

在完成了上面的代码之后,尝试启动上面实现的第一个实例。

此时,我们可以看到,每间隔5秒,这个实例会打印这样的日志:

2021-07-21 17:42:00.122  INFO 63478 --- [           main] .s.b.j.ScheduleJobBootstrapStartupRunner : Starting ElasticJob Bootstrap.
2021-07-21 17:42:00.126  INFO 63478 --- [           main] org.quartz.core.QuartzScheduler          : Scheduler my-sharding-job_$_NON_CLUSTERED started.
2021-07-21 17:42:00.126  INFO 63478 --- [           main] .s.b.j.ScheduleJobBootstrapStartupRunner : ElasticJob Bootstrap started.
2021-07-21 17:42:05.254  INFO 63478 --- [-sharding-job-1] com.didispace.chapter73.MyShardingJob    : 分片1:执行任务
2021-07-21 17:42:05.254  INFO 63478 --- [-sharding-job-3] com.didispace.chapter73.MyShardingJob    : 分片3:执行任务
2021-07-21 17:42:05.254  INFO 63478 --- [-sharding-job-2] com.didispace.chapter73.MyShardingJob    : 分片2:执行任务
2021-07-21 17:42:10.011  INFO 63478 --- [-sharding-job-4] com.didispace.chapter73.MyShardingJob    : 分片1:执行任务
2021-07-21 17:42:10.011  INFO 63478 --- [-sharding-job-5] com.didispace.chapter73.MyShardingJob    : 分片2:执行任务
2021-07-21 17:42:10.011  INFO 63478 --- [-sharding-job-6] com.didispace.chapter73.MyShardingJob    : 分片3:执行任务

每次任务都被拆分成了3个分片任务,就如我上文中所说的,每个分片对应一个switch的分支。由于当前情况下,我们只启动了一个实例,所以3个分片任务都被分配到了这个唯一的实例上。

双实例运行

接下来,我们再启动一个实例(注意使用-Dserver.port来改变不同的端口,不然本地会启动不成功)。此时,两个实例的日志出现了变化:

实例1的日志:

2021-07-21 17:44:50.190  INFO 63478 --- [ng-job_Worker-1] com.didispace.chapter73.MyShardingJob    : 分片2:执行任务
2021-07-21 17:44:55.007  INFO 63478 --- [ng-job_Worker-1] com.didispace.chapter73.MyShardingJob    : 分片2:执行任务
2021-07-21 17:45:00.010  INFO 63478 --- [ng-job_Worker-1] com.didispace.chapter73.MyShardingJob    : 分片2:执行任务

实例2的日志:

2021-07-21 17:44:50.272  INFO 63484 --- [-sharding-job-1] com.didispace.chapter73.MyShardingJob    : 分片1:执行任务
2021-07-21 17:44:50.273  INFO 63484 --- [-sharding-job-2] com.didispace.chapter73.MyShardingJob    : 分片3:执行任务
2021-07-21 17:44:55.009  INFO 63484 --- [-sharding-job-3] com.didispace.chapter73.MyShardingJob    : 分片1:执行任务
2021-07-21 17:44:55.009  INFO 63484 --- [-sharding-job-4] com.didispace.chapter73.MyShardingJob    : 分片3:执行任务

随着实例数量的增加,可以看到分片的分配发生了变化。这也就意味着,当一个任务开始执行的时候,两个任务执行实例都被利用了起来,这样我们的任务执行和资源利用的效率就可以得到优化。

你也可以尝试再继续启动实例和关闭实例来观察任务的动态分配,怎么样?这样写定时任务是不是方便多了?一定记得自己动手写一写,这样体会更深哦!如果碰到问题,可以拉取文末的代码示例对比一下是否有地方配置不一样。下一篇,我们还将继续介绍关于定时任务的一些高级内容。关注我,收藏本系列教程《Spring Boot 2.x基础教程》(http://blog.didispace.com/spring-boot-learning-2x/)。

如果学习过程中如遇困难?可以加入我们Spring技术交流群(https://blog.didispace.com/join-group-spring/index.html),参与交流与讨论,更好的学习与进步!

代码示例

本文的完整工程可以查看下面仓库中的chapter7-3目录:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/tree/master/2.x

  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/tree/master/2.x

如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

往期推荐

最强代码生成器平台,杀疯了!

Spring为什么建议使用构造器来注入?

Redis 内存压缩实战,学习了!

微软出手,干翻 IDEA?网友:先干翻Eclipse吧..

OpenJDK 正式宣布AWT、2D、Swing等项目解散

喜欢本文欢迎转发,关注我订阅更多精彩

关注我回复「加群」,加入Spring技术交流群

Spring Boot 2.x基础教程:使用Elastic Job的分片配置相关推荐

  1. Spring Boot 2.x基础教程:MyBatis的多数据源配置

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 前两天,我们已经介绍了关于JdbcTemplate的多数 ...

  2. Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 在本系列之前的教程中,我们已经介绍了如何使用目前最常用的 ...

  3. Spring Boot 2.x基础教程:使用MyBatis的XML配置方式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  4. Spring Boot 2.x基础教程:默认数据源Hikari的配置详解

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

  5. Spring Boot 2.x基础教程:使用JTA实现分布式事务

    在一个Spring Boot项目中,连接多个数据源还是比较常见的.之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见: Spring Boot 2.x基础教程:JdbcTemplate的多数 ...

  6. Spring Boot 2.x基础教程:使用集中式缓存Redis

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 之前我们介绍了两种进程内缓存的用法,包括Spring B ...

  7. Spring Boot 2.x基础教程:使用JTA实现多数据源的事务管理

    在一个Spring Boot项目中,连接多个数据源还是比较常见的.之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见: Spring Boot 2.x基础教程:JdbcTemplate的多数 ...

  8. Spring Boot 2.x基础教程:使用Elastic Job实现定时任务

    上一篇,我们介绍了如何使用Spring Boot自带的@Scheduled注解实现定时任务(https://blog.didispace.com/spring-boot-learning-2-7-1/ ...

  9. Spring Boot 2.x基础教程:使用Redis的发布订阅功能

    通过前面一篇集中式缓存的使用教程,我们已经了解了Redis的核心功能:作为K.V存储的高性能缓存. 接下来我们会分几篇来继续讲讲Redis的一些其他强大用法!如果你对此感兴趣,一定要关注收藏我哦! 发 ...

最新文章

  1. 算法设计与分析之循环与递归
  2. linux服务器centos系统apache路径不区分大小写的解决办法(适用WDCP面板)
  3. Spring Cloud学习系列第六篇【分布式配置中心】
  4. JACK——TeamsManual3 Roles
  5. C++ Opengl绘制3D源码
  6. 排序算法之递归算法(归并排序)
  7. leetcode最小面积_Code Review Swift 算法题: 最小面积矩形  Leetcode 的动人之处
  8. mybatis入门案例
  9. SDK Manager failed to install 'java.exe' locking directory
  10. mysql hash分区 数目_mysql8 参考手册-HASH分区
  11. [蓝桥杯][算法提高VIP]Sharing Chocolate(状压dp记忆化搜索)
  12. 经典面试题(33):以下代码将输出的结果是什么?
  13. 深度优先搜索之城堡问题
  14. oc渲染器中文手册_C4D·OC高级渲染视频教程,带你玩转质感渲染
  15. ubuntu 的 kitti2bag安装与测试
  16. 计算机毕设参考文献、Java参考文献、MySQL参考文献、jsp参考文献、Python参考文献、微信小程序参考文献、外文参考文献
  17. shell脚本快速执行命令
  18. vivox9怎么和计算机共享,vivo手机怎么和笔记本电脑共享文件和网络
  19. Linux内核有加网速功能吗,Linux下使用有线网络和WiFi能不能叠加网速?网友评论不一...
  20. 浏览器端转盘抽奖策略实现

热门文章

  1. C++day15 学习笔记
  2. 网管网络布线之常用兵器谱
  3. python 单一进程实例 实现
  4. python3 使用psutil 查看内存占用
  5. golang 第三方包的使用总结
  6. 虚拟机VMware安装Kali Linux
  7. Linux查看ip的命令详解
  8. Android开发--FileInputStream/OutStream/Sdcard写入
  9. 面试题目集锦 -- 排序算法
  10. java设计模式---桥接模式