背景
定时任务是每个业务常见的需求,比如每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表等等。
在Java中自带的解决方案
- Jdk timer:固定频率执行,同一个线程串行执行
- Jdk ScheduledExecutorService:固定频率执行,支持多线程并发执行,解决timer串行的问题。
以上两种方案都不支持cron表达式,在分布式架构下也不支持幂等执行,一般用的比较少。
Spring中解决方案
- Spring task:支持cron表达式,使用比较轻量,适用于单节点的应用,分布式架构下不支持幂等执行,需要业务自己做抢锁。
- Quartz:Springboot2.0版本支持quartz集成,可以结合数据库做持久化,框架封装抢锁触发逻辑,解决Spring task不支持幂等执行的问题。
如上解决方案都无可视化界面,运维比较麻烦,且无报警,在生产环境容易出问题。Spring Cloud Alibaba定时任务是阿里巴巴基于SchedulerX2.0开发的企业级定时任务解决方案,只需要在application文件中定义自己的任务,就可以一键部署起来,具有环境隔离、应用隔离、高可用、低延时、可视化、可报警等能力。
优势
Spring原生
支持Springboot声明式定义,命名空间、应用、任务、报警等都通过配置文件声明,方便管理自己应用下的任务,并且可以支持修改。可以拿到任何环境一键启动应用。
高可用
SchedulerX2.0采用高可用架构,任务多备份机制,经历阿里集团多年双十一、容灾演练,可以做到整个集群挂掉任意一个机房,任务调度都不会收到影响。
可视化
schedulerx拥有丰富的可视化能力,比如
- 用户大盘
- 查看任务历史执行记录
- 查看任务运行日志
- 查看任务运行堆栈
- 查看任务操作记录
报警监控
- 报警:支持邮件、钉钉、短信、电话,其他报警方式在规划中。支持任务失败、超时、无可用机器报警。报警内容可以简单的看出任务失败的原因,以钉钉机器人为例
分布式模型
Schedulerx2.0提供了丰富的分布式模型,可以处理各种各样的分布式处理业务场景。包括单机、广播、分片、MapReduce等。
如何接入
完整的demo工程请点击下载
- 登录阿里云分布式任务调度Schedulerx2.0控制台,点击开通服务
- pom增加依赖schedulerx2-spring-boot-starter,需要1.5.0.2以上版本
<dependency><groupId>com.aliyun.schedulerx</groupId><artifactId>schedulerx2-spring-boot-starter</artifactId><version>1.5.0.2</version></dependency>
3. 配置application.yml
spring schedulerx2 endpoint acm.aliyun.com #请填写不同regin的endpoint namespace 433d8b23-06e9-xxxx-xxxx-90d4d1b9a4af #region内全局唯一,建议使用UUID生成 namespaceName 学仁测试 appName myTest groupId myTest.group #同一个命名空间下需要唯一 appKey myTest123@alibaba #应用的key,不要太简单,注意保管好 regionId public #填写对应的regionId aliyunAccessKey xxxxxxx #阿里云账号的ak aliyunSecretKey xxxxxxx #阿里云账号的sk alarmChannel sms,ding #报警通道:短信和钉钉 jobs simpleJob jobModel standalone className com.aliyun.schedulerx.example.processor.SimpleJob cron 0/30 * * * * ? # cron表达式 jobParameter hello overwrite true shardingJob jobModel sharding className ccom.aliyun.schedulerx.example.processor.ShardingJob oneTime 2022-06-02 12 00 00 # 一次性任务表达式 jobParameter 0=Beijing,1=Shanghai,2=Guangzhou overwritetrue broadcastJob# 不填写cron和oneTime,表示api任务 jobModel broadcast className com.aliyun.schedulerx.example.processor.BroadcastJob jobParameter hello overwritetrue mapReduceJob jobModel mapreduce className com.aliyun.schedulerx.example.processor.MapReduceJob cron 0 * * * * ? jobParameter100 overwritetrue alarmUsers#报警联系人 user1 userName 张三 userPhone12345678900 user2 userName 李四 ding https //oapi.dingtalk.com/robot/send?access_token=xxxxx
- 实现任务接口,以单机任务为例,更多任务模型可以看demo
packagecom.aliyun.schedulerx.example.processor; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importorg.springframework.stereotype.Component; importcom.alibaba.schedulerx.worker.domain.JobContext; importcom.alibaba.schedulerx.worker.processor.JavaProcessor; importcom.alibaba.schedulerx.worker.processor.ProcessResult; /*** 单机任务,所有节点随机选一台执行*/publicclassSimpleJobextendsJavaProcessor { /** log4j2/logback配置schedulerxLogAppender,可以进行日志采集*/privatestaticfinalLoggerlogger=LoggerFactory.getLogger("schedulerx"); publicProcessResultprocess(JobContextcontext) throwsException { System.out.println("this is process, para="+context.getJobParameters()); logger.info("hello schedulerx!"); returnnewProcessResult(true); } publicvoidkill(JobContextcontext) { } }
如何验证
启动你的springboot启动类,大概1分钟左右,你的定时任务就可以正常调度起来了。
如果想要通过控制台验证和查看任务,也可以访问控制台
- 命名空间创建成功
- 应用创建成功,且有实例注册成功
- 任务创建成功
- 查看历史记录