一、市面上常見的任務調度產品
????????針對分布式任務調度的需求,市場上出現了很多的產品:
? ? ? ? ?其中XXL-job?是我們經常使用的任務調度平臺,XXL這三個英文字母.是以作者名許雪里命名的。
????????可以前往 Gitee 地址進行下載使用
https://gitee.com/xuxueli0323/xxl-job.git
?
二、XXL-JOB的基本使用?
? ? ? ? 在Gitee地址下載完XXL-job?的項目后,項目的結構如下:
2.1、啟動xxl-job-admin服務
? ? ? ? ?首先啟動xxl-job-admin,并在配置文件中修改對應的端口號以及虛擬路徑,配置文件中部分默認的參數如下:
?
????????xxl-job-admin服務是XXL-JOB的web頁面端,所以啟動完xxl-job-admin服務后,可以訪問:
http://localhost:8080/xxl-job-admin/
賬號:admin
密碼:123456
?????????
2.2、登陸xxl-job的web頁面
2.2.1、執行器管理
? ? ? ? 執行器管理頁面中有一個默認的執行器xxl-job-executor-sample,下面來介紹如何編輯執行器。
????????AppName是執行器的唯一標示,所以不能重復。
? ? ? ? 名稱可以自己隨便寫,但是最好見名知意,幫助我們快速的了解這個執行器的作用。
? ? ? ? 注冊方式是調度中心獲取執行器地址的方式 ,一般選自動注冊。
自動注冊和手動錄入的區別:
?
總結:????????? ?
?
2.2.2、任務管理?
? ? ? ? 任務管理頁面是用來編輯任務執行的,下面來介紹如何編輯任務管理。
執行器:每一個任務要對應一個執行器,所以要選擇一個執行器,可供選擇的執行器,就是在2.2.1中編輯好的執行器。
任務描述:此次任務的作用是什么。
負責人:這個任務的負責人是誰。
調度類型:CRON、無、固定速度
????????CRON:是通過CRON表達式來控制任務調用的時間,這個在后面會做一個詳細的介紹。
????????無:不調用
????????固定速度:以固定的時間進行調用,例如每隔5秒進行調用,這個通過CRON表達式也能實現,所以不推薦使用固定速度。
運行模式:運行模式主要分為BEAN和GLUE。BEAN是通過java代碼進行運行,GLUE是通過腳本的方式進行運行(有些銀行的就是采用這種方式)
JobHander:運行模式采用BEAN,右邊就會出現JobHander,JobHander中的值可以任意寫,但是要和代碼中的值保持一致,代碼中通過@XxlJob注解和JobHander中的值相對應。
路由策略:
????????當執行器集群部署時,提供豐富的路由策略
阻塞處理策略:調度過于密集執行器來不及處理時的處理策略
?
2.3、啟動xxl-job-executor-sample-springboot
?xxl-job-executor-sample-springboot?中配置文件里面需要注意的有:
????????xxl.job.admin.addresses:對應2.1中web頁面的IP地址、端口號、虛擬路徑等
????????xxl.job.executor.appname:對應2.2.1中執行器的AppName
????????xxl.job.executor.port:對應執行器的端口號(和server.port中的端口號不一樣)。
? ? ? ?
在?xxl-job-executor-sample-springboot中可以看見XxlJobConfig用來讀取配置文件中的值
package com.xxl.job.executor.core.config;import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** xxl-job config** @author xuxueli 2017-04-28*/
@Configuration
public class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.appname}")private String appname;@Value("${xxl.job.executor.address}")private String address;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}/*** 針對多網卡、容器內部署等情況,可借助 "spring-cloud-commons" 提供的 "InetUtils" 組件靈活定制注冊IP;** 1、引入依賴:* <dependency>* <groupId>org.springframework.cloud</groupId>* <artifactId>spring-cloud-commons</artifactId>* <version>${version}</version>* </dependency>** 2、配置文件,或者容器啟動變量* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'** 3、獲取IP* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();*/}
在SampleXxlJob類中,用來執行任務。
@Component
public class SampleXxlJob {private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);/*** 1、簡單任務示例(Bean模式)*/@XxlJob("demoJobHandler")public void demoJobHandler() throws Exception {XxlJobHelper.log("XXL-JOB, Hello World.");for (int i = 0; i < 5; i++) {System.out.println("執行了第"+i+"次");//XxlJobHelper.log("beat at:" + i);TimeUnit.SECONDS.sleep(2);}// default success}
}
????????SampleXxlJob中@XxlJob的值要和2.2.2任務管理中JobHander的值保持一致。再啟動xxl-job-executor-sample-springboot服務。
? ? ? ? 啟動了xxl-job-executor-sample-springboot服務以及xxl-job-admin服務后,在任務管理頁面點擊執行一次,即可發起調用。
發現調用成功
?
三、?Corn表達式
? ? ? ? 2.2.2中可以通過Corn表達式來控制任務調度的時間,以下是Corn表達式中符號的含義?
? ? ? ? 以下面這個?Corn表達式為例
? ? ? ??
6-21:在時域,表示從早上6點到晚上9點執行。(“-”:指定一個范圍,可以看上表)
0/5:在分域,表示每5分鐘執行一次。(“/”:表示遞增,可以看上表)
0:在秒域,表示第0秒執行。
連起來就是:早上6點到晚上9點這個時間段內,每隔5分鐘執行一次。
例如:06:05:00、06:10:00、06:15:00、06:20:00、06:25:00,一直執行到晚上9點55分。
????????另外:我后面在天域和月域中設置了通配符“*”,表示每月的每天執行。所以就是永遠在執行,所以在年域和周域用“?”,“不指定”也不影響。
?