XXL-JOB任务调度平台 官网

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

中文文档

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

源码仓库地址

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

下载地址

https://github.com/xuxueli/xxl-job/releaseshttps://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>

Python 分布式调度 主从 分布式任务调度原理_业务逻辑

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

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

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

  1. 将业务逻辑和定时任务逻辑完全分开部署,实现解耦、只对业务逻辑实现集群,不对我们的定时任务逻辑集群;—定时任务单机部署版本
问题:如果宕机,如何保证高可用?
  1. 对我们Jar包加上一个开关,项目启动的时候读取该开关 如果为true的情况下则加载定时任务类,否则情况下就不加载该定时任务类;
  2. Python 分布式调度 主从 分布式任务调度原理_定时任务_02

  3. 数据库加上一个主键能够创建成功,则触发定时任务,否则就不触发定时任务;
  4. 分布式锁实实现,只要jar能够拿到分布式锁就能够执行定时任务,否则情况下不执行;

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

Python 分布式调度 主从 分布式任务调度原理_定时任务_03

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

1.多线程形式

每隔1s打印一句话

Python 分布式调度 主从 分布式任务调度原理_任务调度_04

2.timetask

Python 分布式调度 主从 分布式任务调度原理_任务调度_05

3.quartz

Python 分布式调度 主从 分布式任务调度原理_定时任务_06

Python 分布式调度 主从 分布式任务调度原理_定时任务_07

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());
   }
}

Python 分布式调度 主从 分布式任务调度原理_Python 分布式调度 主从_08


Python 分布式调度 主从 分布式任务调度原理_任务调度_09

4.springboot注解形式

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

}

5.线程池

Python 分布式调度 主从 分布式任务调度原理_Python 分布式调度 主从_10

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

定时任务和业务逻辑分开,实现解偶。

Python 分布式调度 主从 分布式任务调度原理_Python 分布式调度 主从_11


Python 分布式调度 主从 分布式任务调度原理_Python 分布式调度 主从_12

6.搭建

Python 分布式调度 主从 分布式任务调度原理_Python 分布式调度 主从_13

Python 分布式调度 主从 分布式任务调度原理_业务逻辑_14


Python 分布式调度 主从 分布式任务调度原理_定时任务_15


Python 分布式调度 主从 分布式任务调度原理_业务逻辑_16


Python 分布式调度 主从 分布式任务调度原理_定时任务_17


Python 分布式调度 主从 分布式任务调度原理_任务调度_18

Python 分布式调度 主从 分布式任务调度原理_业务逻辑_19


Python 分布式调度 主从 分布式任务调度原理_任务调度_20


Python 分布式调度 主从 分布式任务调度原理_定时任务_21


Python 分布式调度 主从 分布式任务调度原理_业务逻辑_22


Python 分布式调度 主从 分布式任务调度原理_Python 分布式调度 主从_23


Python 分布式调度 主从 分布式任务调度原理_业务逻辑_24

自动注册:

Python 分布式调度 主从 分布式任务调度原理_定时任务_25

Python 分布式调度 主从 分布式任务调度原理_任务调度_26

等待几秒

Python 分布式调度 主从 分布式任务调度原理_定时任务_27

手动注册:

Python 分布式调度 主从 分布式任务调度原理_定时任务_28

定时执行

Python 分布式调度 主从 分布式任务调度原理_业务逻辑_29


Python 分布式调度 主从 分布式任务调度原理_业务逻辑_30


Python 分布式调度 主从 分布式任务调度原理_定时任务_31

Python 分布式调度 主从 分布式任务调度原理_业务逻辑_32

Python 分布式调度 主从 分布式任务调度原理_业务逻辑_33


Python 分布式调度 主从 分布式任务调度原理_业务逻辑_34


Python 分布式调度 主从 分布式任务调度原理_定时任务_35

Python 分布式调度 主从 分布式任务调度原理_任务调度_36