分布式任务调度平台XXL-Job原理(8_29)

XXL-JOB任务调度平台 官网

https://www.xuxueli.com/xxl-job/

中文文档

https://www.xuxueli.com/xxl-job/

源码仓库地址

https://github.com/xuxueli/xxl-job
http://gitee.com/xuxueli0323/xxl-job

下载地址

https://github.com/xuxueli/xxl-job/releases
https://gitee.com/xuxueli0323/xxl-job/releases

中央仓库地址

<!-- http://repo1.maven.org/maven2/com/xuxueli/xxl-job-core/ -->
<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>${最新稳定版本}</version>
</dependency>

在这里插入图片描述

1.传统任务调度存在的缺陷

  1. 业务逻辑与定时任务逻辑放入在同一个Jar包中,如果定时任务逻辑挂了也会影响到业务逻辑;
  2. 如果服务器集群的情况下,可能存在定时任务逻辑会重复触发执行;
  3. 定时任务执行非常消耗cpu的资源,可能会影响到业务线程的执行
  4. 在这里插入图片描述
    在这里插入图片描述

2.如何在集群中,保证我们的定时任务只会触发一次

  1. 将业务逻辑和定时任务逻辑完全分开部署,实现解耦、只对业务逻辑实现集群,不对我们的定时任务逻辑集群;—定时任务单机部署版本
问题:如果宕机,如何保证高可用?
  1. 对我们Jar包加上一个开关,项目启动的时候读取该开关 如果为true的情况下则加载定时任务类,否则情况下就不加载该定时任务类;
    在这里插入图片描述

  2. 数据库加上一个主键能够创建成功,则触发定时任务,否则就不触发定时任务;

  3. 分布式锁实实现,只要jar能够拿到分布式锁就能够执行定时任务,否则情况下不执行;

以上的方案都是属于规模比较小的项目,在微服务架构中应该采用分布式任务调度平台
在这里插入图片描述

3. 传统定时任务的实现方案

1.多线程形式

每隔1s打印一句话
在这里插入图片描述

2.timetask

2.

3.quartz

在这里插入图片描述

在这里插入图片描述

public class QuartzTest {
    public static void main(String[] args) throws SchedulerException {
        //1.创建Scheduler的工厂
        SchedulerFactory sf = new StdSchedulerFactory();
        //2.从工厂中获取调度器实例
        Scheduler scheduler = sf.getScheduler();


        //3.创建JobDetail
        JobDetail jb = JobBuilder.newJob(MyJob.class)
                .withDescription("this is a ram job") //job的描述
                .withIdentity("ramJob", "ramGroup") //job 的name和group
                .build();

        //任务运行的时间,SimpleSchedle类型触发器有效
        long time = System.currentTimeMillis() + 3 * 1000L; //3秒后启动任务
        Date statTime = new Date(time);

        //4.创建Trigger
        //使用SimpleScheduleBuilder或者CronScheduleBuilder
        Trigger t = TriggerBuilder.newTrigger()
                .withDescription("")
                .withIdentity("ramTrigger", "ramTriggerGroup")
                //.withSchedule(SimpleScheduleBuilder.simpleSchedule())
                .startAt(statTime)  //默认当前时间启动
                .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //两秒执行一次
                .build();

        //5.注册任务和定时器
        scheduler.scheduleJob(jb, t);

        //6.启动 调度器
        scheduler.start();

    }
}

 

 

public class MyJob implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
       System.out.println("quartz MyJob date:" + new Date().getTime());
   }
}


在这里插入图片描述
在这里插入图片描述

4.springboot注解形式

@Componentpublic class UserScheduled {
    @Scheduled(cron = "0/1 * * * * *")
    public void taskUserScheduled() {
        System.out.println("定时任务触发...");
    }

}

5.线程池

在这里插入图片描述

5.分布式任务调度架构设计原理

定时任务和业务逻辑分开,实现解偶。
在这里插入图片描述
在这里插入图片描述

6.搭建

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自动注册:

在这里插入图片描述在这里插入图片描述

等待几秒
在这里插入图片描述

手动注册:

在这里插入图片描述

定时执行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值