快速入門
任務(wù)調(diào)度產(chǎn)品支持多種任務(wù)類型,包括簡單任務(wù)、集群任務(wù),您可以根據(jù)業(yè)務(wù)的需求,選擇其一實(shí)現(xiàn)業(yè)務(wù)。本文以簡單任務(wù)為例,介紹如何快速完成一個(gè)簡單任務(wù)的本地開發(fā)以及控制臺(tái)任務(wù)配置等。
若您需要任務(wù)調(diào)度工程示例代碼,請下載 示例工程。
操作步驟
本地應(yīng)用開發(fā)。
創(chuàng)建 SOFABoot 工程。
下載并配置好一個(gè) SOFABoot 工程原型。配置步驟,請參見 快速開始。
說明任務(wù)調(diào)度客戶端支持使用 SOFABoot 框架或其它 Maven 工程框架開發(fā)。此處以 SOFABoot 為例介紹應(yīng)用開發(fā)示例。非 SOFABoot 工程的配置,請參見 非 SOFABoot 工程。
引入任務(wù)調(diào)度的依賴。
在 SOFABoot 工程中引入任務(wù)調(diào)度的依賴:
<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>scheduler-enterprise-sofa-boot-starter</artifactId> </dependency>
對于 SOFABoot 3.4.3 以下的版本,需要添加如下 Tracer 依賴。
說明添加前,請仔細(xì)檢查工程是否已經(jīng)依賴了 Tracer,避免 JAR 包沖突問題。
SOFABoot 已在 3.4.3 及其以上版本自動(dòng)依賴 Tracer,無需再手動(dòng)添加。SOFABoot 最新版本信息,詳見 SOFABoot 版本說明。
<dependency> <groupId>com.alipay.sofa</groupId> <artifactId>tracer-enterprise-sofa-boot-starter</artifactId> </dependency>
修改全局配置項(xiàng)。
在
application.properties
文件中,完成中間件全局配置。詳情請參見 properties 配置項(xiàng)。實(shí)現(xiàn)處理器接口。
客戶端提供了
ISimpleJobHandler
接口給業(yè)務(wù)方實(shí)現(xiàn),通過實(shí)現(xiàn)該接口編寫業(yè)務(wù)邏輯代碼。/** * 簡單任務(wù)處理器接口。 */ public interface ISimpleJobHandler extends IJobHandler{ /** * 處理 request。 * * @param context * @return */ ClientCommonResult handle(JobExecuteContext context); }
代碼說明:
JobExecuteContext
是觸發(fā)任務(wù)的請求上下文,您可以從里面獲取到任務(wù)的一些信息。例如在控制臺(tái)創(chuàng)建任務(wù)時(shí)設(shè)置的自定義參數(shù),可以通過getCustomParam(String key)
方法獲取。如果設(shè)置了任務(wù)分片,可以通過方法
getSharding()
獲取當(dāng)前機(jī)器分配到的分片號。詳細(xì)信息可以查看com.alipay.antschedulerclient.model.JobExecuteContext
這個(gè)類的源碼。
實(shí)現(xiàn)類。
類里必須分別實(shí)現(xiàn)
handle
、getThreadPool
、getName
方法。handle
:在該方法里執(zhí)行業(yè)務(wù)邏輯。getThreadPool
:獲取一個(gè)執(zhí)行該任務(wù)的線程池,如果沒有設(shè)置,會(huì)使用客戶端自帶的線程池。getName
:獲取這個(gè)執(zhí)行器的名字。客戶端接收到任務(wù)的觸發(fā)請求時(shí),會(huì)根據(jù)名字尋找匹配的執(zhí)行器。說明當(dāng)任務(wù)需要按多個(gè)步驟執(zhí)行時(shí),需要寫多個(gè)實(shí)現(xiàn)類,并在控制臺(tái)開啟分步。
代碼示例如下:
public class AlwaysSuccessHandler implements ISimpleJobHandler{ private static final String NAME ="ALWAYS_SUCCESS_JOB"; private static final ThreadPoolExecutor executor =new ThreadPoolExecutor(20, 300,1,TimeUnit.HOURS,new ArrayBlockingQueue<Runnable>(100){}) /** * 處理業(yè)務(wù)邏輯。 **/ @Override public ClientCommonResult handle(JobExecuteContext context) throws InterruptedException{ // 獲取自定義參數(shù)。 Integer num =(Integer) context.getCustomParam("num"); if(num ==null){ num =0; } num = num +1; // 更新自定義參數(shù)。 context.putCustomParams("num",5); return ClientCommonResult.buildSuccessResult(); } @Override public ThreadPoolExecutor getThreadPool(){ // 建議使用自定義實(shí)現(xiàn)類。 return executor; } @Override public String getName(){ // handler 名字,管控頁面配置的 handler 即這部分定義內(nèi)容。 return NAME; } }
配置 Spring。
通過以下任一方式將接口實(shí)現(xiàn)類配置為 Spring Bean:
在
src/main/resources/META-INF/xxx/xxx-xxx.xml
文件中進(jìn)行配置。示例如下:<bean id="sampleService" class="com.antcloud.demo.antscheduler.service.SampleServiceImpl"/>
使用注解驅(qū)動(dòng)(annotation-driven)的方式聲明 Bean。
在云端發(fā)布應(yīng)用。
本地客戶端開發(fā)完成后,您需要將其發(fā)布部署到 SOFAStack 經(jīng)典應(yīng)用服務(wù)。詳細(xì)步驟,請參見 發(fā)布部署應(yīng)用。
在控制臺(tái)配置調(diào)度任務(wù)。
登錄任務(wù)調(diào)度控制臺(tái)。
在左側(cè)導(dǎo)航欄選擇 中間件 > 任務(wù)調(diào)度 > 任務(wù)配置。
選擇 添加任務(wù) > 簡單任務(wù),然后配置以下參數(shù):
參數(shù)
說明
任務(wù)名稱
配置任務(wù)的名稱,用于識別任務(wù)。
應(yīng)用名稱
填寫或選擇目標(biāo)應(yīng)用名稱。
必須與工程中
application.properties
文件的spring.application.name
配置的應(yīng)用名稱一致。調(diào)度類型
配置任務(wù)調(diào)度的類型,可選值:
cron 表達(dá)式觸發(fā):該類型的任務(wù)在創(chuàng)建時(shí)需要配置 CRON 表達(dá)式定時(shí)觸發(fā)任務(wù)。
事件觸發(fā):該類型的任務(wù)通過外部事件觸發(fā)任務(wù)。
定時(shí)觸發(fā):該類型的任務(wù)在創(chuàng)建時(shí)也需要配置 CRON 表達(dá)式定時(shí)觸發(fā),并且只能執(zhí)行一次。
Cron 表達(dá)式
配置 CRON 表達(dá)式,用于定時(shí)觸發(fā)任務(wù)。配置方式請參見 CRON 表達(dá)式詳解。
僅在 調(diào)度類型 為 cron 表達(dá)式觸發(fā) 時(shí)配置。
任務(wù)分組(可選)
選擇或新建一個(gè)任務(wù)分組,方便歸納管理任務(wù)。
執(zhí)行器名字
必須與代碼中任務(wù)處理器名字一致,即 實(shí)現(xiàn)類 步驟中
getName
方法獲取的執(zhí)行器名字。是否分片
選擇任務(wù)是否開啟分片:
不開啟分片,任務(wù)將只調(diào)度到一臺(tái)客戶端服務(wù)器上執(zhí)行。
開啟分片,并設(shè)置分片數(shù)為 N,任務(wù)則會(huì)同時(shí)觸發(fā)到 N 臺(tái)客戶端服務(wù)器上并發(fā)執(zhí)行。
如果您開啟了分片,您還需在本地工程編碼實(shí)現(xiàn)任務(wù)分片。代碼參見下文 任務(wù)分片示例代碼 。
自定義參數(shù)(可選)
自定義參數(shù)支持從控制臺(tái)向任務(wù)傳遞參數(shù),參數(shù)也可以在任務(wù)間傳遞,格式為:
key=value
。參數(shù)配置說明如下:
參數(shù)名:設(shè)置自定義參數(shù)的名稱。
支持英文大小寫、數(shù)字、下劃線(_), 不能超過 128 字符。
類型 和 參數(shù)值:可選類型和參數(shù)值配置方式如下。
STRING:支持通用的字符串。
LIST:支持字符串?dāng)?shù)組,例如:
["aaa","bbb"]
。BOOLEAN:支持 true 或 false。
PLACEHOLDER:支持參數(shù)替換,目前支持的變量如下:
${sharding}
:替換當(dāng)前分片值,配合簡單任務(wù)使用。${shardingCount}
:替換簡單任務(wù)配置的分片數(shù)。${triggerTime}
:替換預(yù)期的觸發(fā)時(shí)間。
說明您也可以在業(yè)務(wù)端通過上下文 context(該對象必須實(shí)現(xiàn) Serializable。)獲取和覆蓋自定義參數(shù)。代碼參見下文 獲取和覆蓋自定義參數(shù)示例代碼。
路由策略
選擇執(zhí)行任務(wù)的路由策略,可選值:
隨機(jī):每次執(zhí)行都隨機(jī)分發(fā)到客戶端服務(wù)器上。
定向:每次執(zhí)行都分發(fā)到同一個(gè)客戶端服務(wù)器上。
暫不支持指定客戶端服務(wù)器 IP。
輪詢:每次執(zhí)行依次分發(fā)到每臺(tái)客戶端服務(wù)器上。
通信方式
選擇任務(wù)的通信方式,可選值:
單向 ONEWAY:單向操作,沒有返回值。控制臺(tái)不記錄觸發(fā)記錄、無超時(shí)、無重試。
高頻非重要任務(wù)時(shí)建議使用。
回調(diào) CALLBACK:雙向操作,有返回值。控制臺(tái)可查看觸發(fā)記錄、可設(shè)置超時(shí)、可重試。
重要任務(wù)時(shí)建議使用,觸發(fā)間隔至少 5 分鐘。
任務(wù)互斥
選擇是否開啟任務(wù)互斥模式。開啟任務(wù)互斥模式時(shí),處在“執(zhí)行中”或“暫停”狀態(tài)的任務(wù)即使已經(jīng)達(dá)到下一個(gè)任務(wù)觸發(fā)時(shí)間點(diǎn),仍無法再次觸發(fā)。本次調(diào)度狀態(tài)以“跳過”標(biāo)記。默認(rèn)為不開啟。
僅當(dāng) 通信方式 設(shè)置為 回調(diào) CALLBACK 時(shí)配置。
漏觸發(fā)策略
設(shè)置任務(wù)漏觸發(fā)時(shí)的處理策略,可選值:
忽略:不進(jìn)行補(bǔ)償處理。
立即觸發(fā):立即重新觸發(fā)。
時(shí)間充裕時(shí)觸發(fā):是否進(jìn)行補(bǔ)償觸發(fā)取決于下次觸發(fā)前的剩余時(shí)間是否充裕。若當(dāng)前時(shí)間 + 超時(shí)時(shí)間 < 下次觸發(fā)時(shí)間,則進(jìn)行補(bǔ)償觸發(fā),并將此次補(bǔ)償觸發(fā)插入觸發(fā)記錄;反之,則不觸發(fā)。多次漏觸發(fā)進(jìn)行恢復(fù)時(shí)僅進(jìn)行一次補(bǔ)償觸發(fā)。
僅當(dāng) 通信方式 設(shè)置為 回調(diào) CALLBACK,且 調(diào)度類型 為 cron 表達(dá)式觸發(fā) 時(shí),可配置此項(xiàng)。
超時(shí)策略
設(shè)置任務(wù)執(zhí)行超時(shí)后的處理策略,可選值:
不處理:觸發(fā)記錄和執(zhí)行記錄狀態(tài)均標(biāo)記為失敗。
按失敗策略重試:本次調(diào)度記錄狀態(tài)標(biāo)為失敗,并按照 失敗處理策略 進(jìn)行失敗重試。重試后本次調(diào)度記錄將被重置為重試結(jié)果。
停止后續(xù)觸發(fā):執(zhí)行記錄狀態(tài)為失敗,觸發(fā)記錄狀態(tài)為超時(shí),并且無法再次觸發(fā)。僅當(dāng)開啟任務(wù)互斥模式時(shí)可選擇此項(xiàng)。
僅當(dāng) 通信方式 設(shè)置為 回調(diào) CALLBACK 時(shí)配置。
超時(shí)時(shí)間
設(shè)置任務(wù)執(zhí)行的超時(shí)時(shí)間,當(dāng)任務(wù)超過此時(shí)間未回調(diào)則認(rèn)為執(zhí)行失敗。單位可選擇為 分鐘 和 小時(shí)。
僅當(dāng) 通信方式 設(shè)置為 回調(diào) CALLBACK 時(shí)配置。
失敗處理策略
設(shè)置任務(wù)執(zhí)行失敗后的處理策略,可選值:
不重試:失敗后不進(jìn)行重試。
最多重試三次:失敗后立即進(jìn)行重試,但最多重試三次。
重試到下次觸發(fā):失敗后立即進(jìn)行重試,直到下次觸發(fā)時(shí)間。
優(yōu)先級
用于識別任務(wù)的重要性,暫無其他作用。
默認(rèn)為 中等。
描述(可選)
配置任務(wù)的描述信息,例如業(yè)務(wù)含義、影響范圍等,最多 1024 個(gè)字符。
任務(wù)分片示例代碼
public class ShardingSchedule implements ISimpleJobHandler { private final Logger LOGGER = LoggerFactory.getLogger(ShardingSchedule.class); private ThreadPoolExecutor threadPool; @Override public String getName() { return "SHARDING_SCHEDULE"; } @Override public ClientCommonResult handle(JobExecuteContext jobExecuteContext) throws Exception { int sharding = jobExecuteContext.getSharding(); //當(dāng)前機(jī)器獲取到的分片數(shù) LOGGER.info("current machine sharding is " + sharding); //總的分片數(shù) System.out.println("total sharding num is " + jobExecuteContext.getShardingCount()); System.out.println("activity sharding is" + jobExecuteContext.getActivitySharding()); return ClientCommonResult.buildSuccessResult(); } @Override public ThreadPoolExecutor getThreadPool() { return threadPool; } /** * Setter method for property threadPool. * * @param threadPool value to be assigned to property threadPool */ public void setThreadPool(ThreadPoolExecutor threadPool) { this.threadPool = threadPool; } }
獲取和覆蓋自定義參數(shù)示例代碼
public class SimpleTaskDemo implements ISimpleJobHandler { @Override public ClientCommonResult handle(JobExecuteContext context) { // 根據(jù) key 獲取 obj Object obj = context.getCustomParam("intObj"); // 獲取自定義參數(shù) Map<String, Object> paramsMap = context.getCustomParams(); context.putCustomParams("num", 2); List<String> listparam = newArrayList <>(); listparam.add("aaaaaa"); listparam.add("111111"); context.putCustomParams("intparam", 111); context.putCustomParams("stringparam", "dfadsfad1243"); context.putCustomParams("listparam", listparam); // 注意對象必須實(shí)現(xiàn) Serializable context.putCustomParams("objectParam", newObject()); return ClientCommonResult.buildSuccessResult(); } .... }
單擊 提交。
在任務(wù)列表中打開目標(biāo)任務(wù)的 是否啟用 開關(guān)。
如果有客戶端在線,新配置的任務(wù)自動(dòng)有客戶端注冊。任務(wù)在禁用的狀態(tài)下,您也可以在操作列單擊 觸發(fā),手動(dòng)觸發(fā)一次任務(wù)。
查看任務(wù)調(diào)度記錄
在任務(wù)列表中,單擊目標(biāo)任務(wù)名稱。
單擊 調(diào)度記錄 頁簽,查看調(diào)度記錄。
調(diào)度記錄最多保留 7 天。您可以使用頁簽上方的下拉列表篩選調(diào)度記錄類型,包括全部調(diào)度記錄、調(diào)度執(zhí)行成功、調(diào)度執(zhí)行失敗以及漏調(diào)度記錄。