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