DataWorks的开发平台提供了OpenAPI、OpenEvent、Extensions功能,支持您通过这三个开放性功能,实现对指定流程的自定义管控与响应。本文以一个任务发布封网管控的业务场景为例,如在数据开发页面提交发布节点事件,为您演示如何进行开放平台的相关配置。
本实践涉及的开放平台的相关功能介绍与基本概念可参见OpenEvent概述、扩展程序概述。
场景说明
订阅配置说明
配置订阅时,通过事件规则指定订阅的事件类型为文件提交或发布。
标准模式空间环境时:dataworks:FileChange:CommitFile。
简单模式空间环境时:dataworks:FileChange:DeployFile。
操作步骤
步骤一:配置自定义总线
开启并配置消息订阅的详细步骤请参见开启消息订阅,以下为本实践中的核心配置流程与注意事项。
登录事件总线EventBridge控制台,单击左侧导航栏事件总线,进入事件总线创建页面。
若未开通事件总线,请开通事件总线EventBridge并授权。
单击
按钮,创建自定义事件总线。在总线模块内配置完自定义事件总线名称后,单击下一步,进入事件源配置。
单击跳过,跳过事件源、规则、目标模块的配置。同时填写描述信息。步骤 2(事件源)、步骤 3(规则)和步骤 4(目标)可跳过。
单击左侧导航栏事件总线进入事件总线创建页面,找到已创建的事件总线后,单击名称,进入事件总线概览页面。
单击左侧导航栏事件规则进入事件规则页面后,单击创建规则新建事件规则。
本实践定义该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平台审核,审核事件通常在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.aliyun.dataworks_public20200518.Client;
import com.aliyun.dataworks_public20200518.models.UpdateIDEEventResultRequest;
import com.aliyun.dataworks_public20200518.models.UpdateIDEEventResultResponse;
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
Client 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 response = client.updateIDEEventResult(updateIDEEventResultRequest);
// 请求的唯一标识,用于后续错误排查使用
System.out.println("response:" + response.getBody().getRequestId());
} catch (Exception e) {
System.out.println("consumerEventBridge error:" + e.getMessage());
throw new RuntimeException(e);
}
} 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
此时会成功启动工程,如以下输出所示:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.2)
2022-08-02 20:07:59.521 INFO 48144 --- [ main] com.aliyun.dataworks.DemoStarter : Starting DemoStarter v1.0 using Java 1.8.0_151 on xxxdeMacBook-Pro.local with PID 48144 (/xxx/xxx/n-demo-deploycontroller/target/extension/demo-deploycontroller-1.0.jar started by xxx in xxx/xxx/extension-xxx-demo-deploycontroller)
2022-08-02 20:07:59.523 INFO 48144 --- [ main] com.aliyun.dataworks.DemoStarter : No active profile set, falling back to 1 default profile: "default"
2022-08-02 20:08:00.440 INFO 48144 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-08-02 20:08:00.452 INFO 48144 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-08-02 20:08:00.452 INFO 48144 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.65]
2022-08-02 20:08:00.452 INFO 48144 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-08-02 20:08:00.576 INFO 48144 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1002 ms
2022-08-02 20:08:00.576 INFO 48144 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-08-02 20:08:00.945 INFO 48144 --- [ main] com.aliyun.dataworks.DemoStarter : Started DemoStarter in 1.771 seconds (JVM running for 2.199)
2022-08-02 20:08:07.853 INFO 48144 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-08-02 20:08:07.854 INFO 48144 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'在浏览器输入http://localhost:8080/index会得到"hello world!",表示应用成功部署,打通网络后即可订阅EventBridge的消息了。
结果验证
完成代码部署与打通EventBridge的网络后,您可以在开启扩展程序的空间内进行验证。
验证方式:在代码编辑器中单击提交按钮触发扩展程序的提交前置事件检查。提交后界面弹出"检查中"提示,表示检查通过后将自动执行操作,可在左侧操作检查面板查看检查记录列表及状态。单击编辑器底部操作检查面板可查看检查详情,包括检查类型(如提交前检查_测试程序)、当前状态及查看详情操作入口。