先来介绍一个场景 :
我需要做一个定时任务,用spring框架中spring-task
@SpringBootApplication @EnableScheduling//开启定时任务 public class TaskApplication { public static void main(String[] args) { SpringApplication.run(TaskApplication.class,args); } }
@Component public class HelloJob { @Scheduled(cron = "0/2 * * * * ?")//cron表达式定时任务的触发时间 public void eat(){ System.out.println("每隔5秒吃一次饭,我想成为一个胖子"+new Date()); } }
这个时候我们模拟集群部署(分布式任务)
分布式任务调度面临的问题:
当任务调度以集群方式部署,同一个任务调度可能会执行多次,例如:电商系统定期发放优惠券,就可能重复发放优惠券,对公司造成损失,信用卡还款提醒就会重复执行多次,给用户造成烦恼,所以我们需要控制相同的任务在多个运行实例上只执行一次。常见解决方案:
分布式锁,多个实例在任务执行前首先需要获取锁,如果获取失败那么就证明有其他服务已经在运行,如果获取成功那么证明没有服务在运行定时任务,那么就可以执行。
超级牛逼的分布式任务调度框架=====>xxl-Job
想控制分布式任务,最简单的就是加分布式锁,如:Redis的 setnx
我想即控制分布式任务的执行,又想随时修改定时任务的条件===> xxl-job
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。源码地址:xxl-job: 一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
文档地址:分布式任务调度平台XXL-JOB
原理:
在虚拟机中运行, http://192.168.85.143:8080/xxl-job-admin
登录 浏览器访问, http://192.168.85.143:8080/xxl-job-admin
默认登录账号 “admin/123456”, 登录后运行界面如下图所示
在执行器管理页面新增执行器,
这就相当于一个项目,一个新项目可能有多个定时任务,管理定时任务
然后自己启动对应的项目测试一下
如果关闭了防火墙,xxl-job还是和代码所在服务器不连通,可以手动指定代码所在ip段
查看流程,win+r在cmd进入命令行,ipconfig查看自己的网卡
手动指定代码所在ip段
在项目的配置文件中添加ip段
在配置类中读取ip
成功了