分散式任務排程平臺
阿新 • • 發佈:2018-11-08
一、任務排程概述
1.什麼是任務排程--定時job 在什麼時間進行執行程式碼任務
任務排程場景:定時檢查紅包過期
2.java實現定時任務有幾種?
Thread.sleep
TimerTask util包下
執行緒池,可定時執行緒
Quartz定時任務排程框架
二、使用Quartz實現定時排程
假如兩臺伺服器都有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
五、分散式任務排程平臺執行原理
1.什麼是任務排程--定時job 在什麼時間進行執行程式碼任務
任務排程場景:定時檢查紅包過期
2.java實現定時任務有幾種?
Thread.sleep
TimerTask util包下
執行緒池,可定時執行緒
Quartz定時任務排程框架
springboot 內建定時任務排程
/** * 使用多執行緒方式實現定時job 最簡單版定時任務排程 * Created by yz on 2018/04/07. */ public class ThreadJob { static intcount = 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
七、任務排程平臺路由策略