1. 程式人生 > >分散式任務排程平臺

分散式任務排程平臺

一、任務排程概述 

1.什麼是任務排程--定時job 在什麼時間進行執行程式碼任務
任務排程場景:定時檢查紅包過期
2.java實現定時任務有幾種?
        Thread.sleep
TimerTask  util包下
執行緒池,可定時執行緒
Quartz定時任務排程框架

springboot 內建定時任務排程

/**
 * 使用多執行緒方式實現定時job  最簡單版定時任務排程
 * Created by yz on 2018/04/07.
 */
public class ThreadJob {
    static int 
count = 0; public static void main(String[] args) { // 實現定時認為,特徵,一直在執行,到時間執行 new Thread(new Runnable() { @Override public void run() { // 監聽任務排程 while (true){ // 每隔一秒時間實現定時 try { Thread.sleep
(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("我是第"+(count++)); } } }).start(); } }
import java.util.Timer;
import java.util.TimerTask;

/**
* timerTask 實現定時job * Created by yz on 2018/04/07. */ public class TimerTaskJob { static int count = 0; public static void main(String[] args) { TimerTask timerTask = new TimerTask() { @Override public void run() { // 執行任務程式碼 System.out.println("我是第"+(count++)); } }; Timer timer = new Timer(); // 天數 0每天 long delay = 0; // 毫秒數 long period = 1000; timer.scheduleAtFixedRate(timerTask,delay,period); } }
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 執行緒池實現定時job
 * 執行緒池四種實現,可快取,可定長,可定時及單執行緒執行緒池
 * Created by yz on 2018/04/07.
 */
public class ThreadPoolJob {
    static int count = 0;
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("我是第"+(count++));
            }
        };
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 引數2:首次執行的延時時間,引數2:定時執行的間隔時間
        service.scheduleAtFixedRate(runnable,1,1, TimeUnit.SECONDS);
    }
}
 
二、使用Quartz實現定時排程

pom.xml

<!-- quartz-->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.2.1</version>
</dependency>
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.util.Date;

/**
 * Quartz 實現定時job
 * Created by yz on 2018/04/07.
 */
public class QuartzJob implements Job{

    // 執行任務排程方法
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("quartz QuartzJob date:"+ new Date().getTime());
    }
}
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;

/**
 * Created by yz on 2018/04/07.
 */
public class TestQuartzJob {
    public static void main(String[] args) throws SchedulerException {
        // 1.建立scheduler工廠
        SchedulerFactory sf = new StdSchedulerFactory();
        // 2.從工廠中獲取排程器例項
        Scheduler scheduler = sf.getScheduler();
        // 3.建立JobDetail
        JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class)
                .withDescription("this is a ram job") // job的描述
                .withIdentity("ramJob", "ramGroup") // job的name和group
                .build();
        // 任務執行的時間,
        long time = System.currentTimeMillis()+3*1000L; // 3秒後啟動任務
        Date statTime = new Date(time);

        // 4.建立Trigger 表示式規則
        Trigger trigger = TriggerBuilder.newTrigger()
                .withDescription("")
                .withIdentity("ramTrigger", "ramTrigger")
                .startAt(statTime)
                .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?"))  // 兩秒執行一次
                .build();

        // 5.註冊任務和定時器
        scheduler.scheduleJob(jobDetail,trigger);
        // 6.啟動排程器
        scheduler.start();
    }
}
 

三、分佈JOB如何解決冪等性

叢集情況下,實現定時job會產生什麼問題?
假如兩臺伺服器都有QuartzJob,伺服器啟動起來會執行兩次。

分散式job如何解決冪等性?
1.使用分散式鎖(zk、redis) 保證只有一臺伺服器執行job
2.使用配置檔案方式,配置檔案開關 start=true 執行 或則好 start=false 不執行,打兩個不同war包,這樣叢集就沒用了。
3.使用資料庫唯一標識 ,必須插入一條資料,效率低,不用。

傳統任務排程 缺點:
1.沒有補償機制 2.不支援叢集 3.不支援路由策略(類似負載均衡,分發到哪個job執行)4.統計,哪些job失敗了
5.job管理平臺 6.報警郵箱,job失敗後重試n多次還不行,傳送報警。7.狀態監控

-- 分散式任務排程平臺
解決傳統任務排程缺點。
人性化,比如修改任務時間,不需要修改程式碼、不需要重新發版.

 
四、XXL-JOB環境概述

免費開源
http://www.xuxueli.com/page/projects.html
原始碼地址:https://github.com/xuxueli/xxl-job

 
五、分散式任務排程平臺執行原理

分散式job排程平臺原理:任何job先在任務排程平臺執行,再由任務排程平臺路由到實際job伺服器。保證了job冪等性。
使用:

首先建立一個數據庫及表結構:執行 tables_xxl_job.sql 

啟動xxl-job-admin



 

六、任務排程平臺執行器執行

執行器管理-新增執行器


任務管理-新增任務



檢視排程日誌:


啟動springboot job專案,列印

Hello Job---->9999

 

七、任務排程平臺路由策略