DataWorks的開發平臺提供了OpenAPI、OpenEvent、Extensions功能,支持您通過這三個開放性功能,實現對指定流程的自定義管控與響應。本文以一個任務發布封網管控的業務場景,如在數據開發頁面提交發布節點事件為例,為您演示如何進行開放平臺的相關配置。
背景信息
本實踐涉及的開放平臺的相關功能介紹與基本概念可參見OpenEvent概述、擴展程序概述。
場景說明
訂閱配置說明
配置訂閱時,通過事件規則指定訂閱的事件類型為文件提交或發布。
標準模式空間環境時:dataworks:FileChange:CommitFile。
簡單模式空間環境時:dataworks:FileChange:DeployFile。
前提條件
操作步驟
步驟一:配置自定義總線
開啟并配置消息訂閱的詳細步驟請參見開啟消息訂閱,以下為本實踐中的核心配置流程與注意事項。
登錄事件總線EventBridge控制臺,單擊左側導航欄事件總線,進入事件總線創建頁面。
單擊按鈕,創建自定義事件總線。
在總線模塊內配置完自定義事件總線名稱后,單擊下一步,進入對事件源配置中。
單擊跳過,跳過事件源、規則、目標模塊的配置。
單擊左側導航欄事件總線進入事件總線創建頁面,找到已創建的事件總線后,單擊名稱,進入事件總線概覽頁面。
單擊左側導航欄事件規則進入事件規則頁面后,單擊創建規則新建事件規則。
本實踐定義該EventBridge自定義總線可接收DataWorks文件提交事件消息和文件發布事件消息,配置demo與核心參數如下。
配置基本信息:自定義規則名稱即可。
實踐模式內容。
事件源類型:選擇自定義事件源。
事件源:不進行配置。
模式內容:以JSON格式編寫,配置內容如下。本示例以標準空間為例。
說明如果是簡單模式的工作空間,可配置為dataworks:FileChange:DeployFile。
{ "source": [ "acs.dataworks" ], "type": [ "dataworks:FileChange:CommitFile" ] }
source:定義事件的產品名稱標識acs.dataworks。
type:定義產品下事件的類型標識,配置為dataworks:FileChange:CommitFile。
事件模式調試:將source、type取值進行補充修改,然后進行事件測試,測試成功后單擊下一步。
配置事件目標。
服務類型:選擇HTTPS或HTTP,更多服務類型可參見管理事件規則。
URL:填寫接收自定義總線推送信息的URL,例如
https://服務器地址:端口號/extensions/consumer
。Body:選擇完整事件。
網絡類型:選擇公網。
步驟二:配置事件分發通道
進入開放平臺頁面。
登錄DataWorks控制臺,切換至目標地域后,單擊左側導航欄的 ,進入開放平臺的開發者后臺頁面。
在開發者后臺頁面,單擊左側導航欄OpenEvent,進入頁面后,單擊添加事件分發通道,在彈窗內進行配置。
要分發事件的工作空間:選擇已創建空間。
指定分發到EventBridge中自定義總線:選擇步驟一創建的事件總線。
保存事件分發通道后,在事件分發通道的操作列,單擊啟用按鈕,啟用新建的事件分發通道。
步驟三:注冊并配置擴展程序
進入開放平臺頁面。
登錄DataWorks控制臺,切換至目標地域后,單擊左側導航欄的 ,進入開放平臺的開發者后臺頁面。
在開發者后臺頁面,單擊左導航欄擴展程序,進入頁面后,單擊注冊擴展程序,在彈窗內進行配置。
部署方式選擇:通過自建服務部署。
注冊擴展程序。
擴展程序名稱:自定義配置。
處理的擴展點:選擇文件提交前置事件、文件發布前置事件。
測試用工作空間:配置后,可在擴展性程序創建好,但并未提交前針對該空間內進行擴展程序測試。
擴展程序參數配置:文件提交前置事件。
其他參數可根據界面提示進行配置即可。
配置完成以上內容后,單擊確定保存注冊擴展程序。
在已創建好的擴展程序的操作列,單擊提交,進入審核狀態。
說明擴展程序審核由DataWorks平臺審核,審核事件通常在T+3個工作日完成,請耐心等待。
如需要測試創建的擴展程序,需要配置測試用工作空間。
審核通過后,單擊操作列的上線,即可上線使用該擴展程序。
單擊擴展程序管理按鈕,進入
頁面,選擇創建的擴展程序,在啟用列啟用該擴展程序。
開發配置擴展程序
示例代碼
該代碼通過EventBridge推送至服務的消息調動服務,獲取服務啟動的當前日期與節假日及其封網管控日期進行對比,判斷是否為管控日期,判斷結果通過UpdateIDEEventResult這個OpenAPI來回調至DataWorks中。
環境構建:Java8,Maven構建工具。
package com.aliyun.dataworks.demo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dataworks.config.Constants;
import com.aliyun.dataworks.config.EventCheckEnum;
import com.aliyun.dataworks.config.ExtensionParamProperties;
import com.aliyun.dataworks.services.DataWorksOpenApiClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dataworks_public.model.v20200518.UpdateIDEEventResultRequest;
import com.aliyuncs.dataworks_public.model.v20200518.UpdateIDEEventResultResponse;
import com.aliyuncs.exceptions.ClientException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.List;
/**
* @author dataworks demo
*/
@RestController
@RequestMapping("/extensions")
public class ExtensionsController {
@Autowired(required = false)
private DataWorksOpenApiClient dataWorksOpenApiClient;
@Autowired
private ExtensionParamProperties extensionParamProperties;
/**
* 接收eventBridge推送過來的消息
* @param jsonParam
*/
@PostMapping("/consumer")
public void consumerEventBridge(@RequestBody String jsonParam){
JSONObject jsonObj = JSON.parseObject(jsonParam);
String eventCode = jsonObj.getString(Constants.EVENT_CODE_FILED);
if(Constants.COMMIT_FILE_EVENT_CODE.equals(eventCode)){
//初始化client
IAcsClient client = dataWorksOpenApiClient.createClient();
//獲取當前時間
SimpleDateFormat sdf = new SimpleDateFormat(Constants.YYYY_MM_DD);
String now = sdf.format(System.currentTimeMillis());
//獲取2022年節假日及其封網管控日期
List<String> holidayList = Arrays.asList(extensionParamProperties.getHolidayList().split(","));
//判斷當前時間是否是管控日
boolean isExists = holidayList.stream().anyMatch(day -> day.equals(now));
//回調方法
UpdateIDEEventResultRequest updateIDEEventResultRequest = new UpdateIDEEventResultRequest();
updateIDEEventResultRequest.setMessageId(jsonObj.getString("id"));
updateIDEEventResultRequest.setExtensionCode(extensionParamProperties.getExtensionCode());
//是管控日 檢查不通過
if(isExists){
updateIDEEventResultRequest.setCheckResult(EventCheckEnum.FAIL.getCode());
updateIDEEventResultRequest.setCheckResultTip("管控日不可作提交文件操作");
}else{
//非管控日 檢查通過
updateIDEEventResultRequest.setCheckResult(EventCheckEnum.OK.getCode());
updateIDEEventResultRequest.setCheckResultTip(EventCheckEnum.OK.getName());
}
try {
//回調DataWorks
UpdateIDEEventResultResponse acsResponse = client.getAcsResponse(updateIDEEventResultRequest);
//請求的唯一標識,用于后續錯誤排查使用
System.out.println("acsResponse:" + acsResponse.getRequestId());
} catch (ClientException e) {
//請求的唯一標識,用于后續錯誤排查使用
System.out.println("RequestId:" + e.getRequestId());
//錯誤狀態碼
System.out.println("ErrCode:" + e.getErrCode());
//錯誤描述信息
System.out.println("ErrMsg:" + e.getErrMsg());
}
}else{
System.out.println("未能過濾其他事件,請檢查配置步驟");
}
}
}
示例工程部署
準備環境與工程
依賴環境:Java8及以上,Maven構建工具。
部署方式
本地部署:將工程文件打成jar包后,在本地環境中已部署Java8和Maven工具的本地服務器或Windows上進行
java -jar yourapp.jar
運行服務程序。云平臺部署:將工程文件打成jar包后,上傳至相應的運行環境例如:Docker容器、云服務器等進行部署。
下載工程后,進入工程根目錄下執行打包命令,將工程項目打成jar包。
mvn clean package -Dmaven.test.skip=true spring-boot:repackage
執行jar包:
java -jar target/extension-demo-deploycontroller-1.0.jar
此時會成功啟動工程,如下圖所示:在瀏覽器輸入http://localhost:8080/index
會得到"hello world!"
,表示應用成功部署,打通網絡后即可訂閱EventBridge的消息了。
結果驗證
完成代碼部署與打通EventBridge的網絡后,您可以在開啟擴展程序的空間內進行驗證。