旁边的女乘客太吵,我实在忍无可忍,便对她说:“你能不能让我睡会儿?”
她挥手就给了我一个耳光:“你个臭流氓!”
我顿时就清醒了,理论到:“你让我睡一会怎么了吗”
她害羞的低下了头,说道:“人家不是随便的人”
我:“我也不是随便的人,下一站我们下车把话说清楚”
任务调度相信大家对任务调度都不陌生,说的通熟一点就是定时任务;这个在我们的项目中或多或少都存在,我们可以用 JDK 自带的(Timer、ScheduledExecutor)来实现,也可以用 Spring 的 Scheduler 来实现,不管用以上哪种方式,我们都是在单机上跑,如果我们以集群的方式部署,会不会出现什么问题 ?
集群中的各个节点都会执行定时调度,会有重复执行的问题,那怎么办? 我们可以加配置,只启动某个节点的定时任务,但是这时候又会出现单点问题
那有没有什么办法,既能避免重复执行,又不会出现单点问题呢? 分布式调度应运而生,常见的分布式任务调度框架有:quartz 、cronsun、Elastic-job、saturn、lts、TBSchedule、xxl-job 等
quartz 我已经简单讲过,有兴趣的可以去看看:请点我,你们会发现:楼主压根就没讲 quartz 的集群模式。你们发现的很对,我就是没讲,就问你气不气 ?
既然你们对 quartz 已经有了一定的了解了 ,那么它的集群模式交给你们自己了
今天我们就一起来了解下另外一个分布式调度平台:xxl-job
关于 xxl-job 是什么、有什么特性、发展历程、接入了哪些公司、各个版本的新特性等等问题,我都不会去讲,因为官方文档已经说的非常清楚了。xxl-job 是国产的,如果文档还看不懂,那就需要回学校再造了。但是我还是想强调下它的架构图
通过这个架构图,我们可以对其有个大致的了解;大体上分为调度中心 和 执行器,调度中心通过调度规则(cron表达式)对执行器中的任务进行调度,执行器收到调度后,执行具体的任务(Job)
既然官方文档都说的非常细致了,那我还能讲什么呢 ? 好像确实么什么可以说的了, 那今天就到这吧,大家散会!
大家先别急着走,虽然下面的内容在官方文档中已经存在,但是却很容易被我们忽略;我会在搭建的过程中来穿插着一些问题,来巩固我们容易忽略的点
单节点搭建我们先搭一个简单的,调度中心 和 执行器 都先搭建成单节点
按照官方的文档来,一步一步很容易搭建成功
源码下载源码地址:xxl-job,可以 git clone 也可以 Download ZIP ,不管何种方式,我们拿到了源码,导入到 IDEA,结构如下
初始化 “调度数据库”
SQL 脚本在源码中已存在,路径: xxl-job-master\doc\db\tables_xxl_job.sql ,执行此脚本,创建数据库和表,如下图
配置&部署 调度中心
配置文件: appliction.properties ,内容如下
### web server.port=8080 server.servlet.context-path=http://www.likecs.com/xxl-job-admin ### actuator management.server.servlet.context-path=http://www.likecs.com/actuator management.health.mail.enabled=false ### resources spring.mvc.servlet.load-on-startup=0 spring.mvc.static-path-pattern=http://www.likecs.com/static/** spring.resources.static-locations=classpath:/static/ ### freemarker spring.freemarker.templateLoaderPath=classpath:/templates/ spring.freemarker.suffix=.ftl spring.freemarker.charset=UTF-8 spring.freemarker.request-context-attribute=request spring.freemarker.settings.number_format=0.########## ### mybatis mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml #mybatis.type-aliases-package=com.xxl.job.admin.core.model ### xxl-job, datasource spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root_pwd spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ### datasource-pool spring.datasource.type=com.zaxxer.hikari.HikariDataSource spring.datasource.hikari.minimum-idle=10 spring.datasource.hikari.maximum-pool-size=30 spring.datasource.hikari.auto-commit=true spring.datasource.hikari.idle-timeout=30000 spring.datasource.hikari.pool-name=HikariCP spring.datasource.hikari.max-lifetime=900000 spring.datasource.hikari.connection-timeout=10000 spring.datasource.hikari.connection-test-query=SELECT 1 ### xxl-job, email spring.mail.host=smtp.qq.com spring.mail.port=25 spring.mail.username=xxx@qq.com spring.mail.from=xxx@qq.com spring.mail.password=xxx spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory ### xxl-job, access token xxl.job.accessToken= ### xxl-job, i18n (default is zh_CN, and you can choose "zh_CN", "zh_TC" and "en") xxl.job.i18n=zh_CN ## xxl-job, triggerpool max size xxl.job.triggerpool.fast.max=200 xxl.job.triggerpool.slow.max=100 ### xxl-job, log retention days xxl.job.logretentiondays=30