本篇文章将详细介绍DataWorks OpenAPI从初始化客户端、创建业务流程以及节点发布上线,再到删除节点和业务流程,帮助您快速上手使用DataWorks OpenAPI。
背景信息
DataWorks OpenAPI进行数据开发时,整体流程如下图所示。
操作步骤
初始化客户端。
public class IdePopApiTest { // 账号信息 @Value("${aliyun.akId}") private String akId; @Value("${aliyun.akSecret}") private String akSecret ; // 例:cn-shanghai @Value("${aliyun.region}") private String region; // 例:dataworks.cn-shanghai.aliyuncs.com @Value("${aliyun.endpoint}") private String endpoint; private IAcsClient client; @Before public void init() throws ClientException { String product = "dataworks-public"; IClientProfile profile = DefaultProfile.getProfile(region, akId, akSecret); DefaultProfile.addEndpoint(region, product, endpoint); client = new DefaultAcsClient(profile); } }
创建业务流程。
public void createBusiness() throws ClientException { CreateBusinessRequest request = new CreateBusinessRequest(); //右上角小扳手里,工作空间ID request.setProjectId(78837L); //右上角小扳手里,工作空间名称 request.setProjectIdentifier("zxy_8221431"); //新业务流程名,唯一值 request.setBusinessName("test_create_business"); //NORMAL(数据开发)、MANUAL_BIZ(手动业务流程) request.setUseType("NORMAL"); CreateBusinessResponse acsResponse = client.getAcsResponse(request); log.info(acsResponse.toString()); }
说明UpdateBusiness和DeleteBusiness可以修改和删除业务流程,删除业务流程是要保证指定的业务流程中所有的节点已经删除。
ListBusiness可以查看指定工作空间下符合匹配条件的所有业务流程。
GetBusiness可以查看查询业务流程的详情。
创建文件夹。
public void createFloder() throws ClientException { CreateFolderRequest request = new CreateFolderRequest(); request.setProjectId(78837L); // 路径:“业务流程/” + 目标业务流程名 + 目录名 + 最新文件夹名 request.setFolderPath("业务流程/test_create_business/通用/test_floder_123"); CreateFolderResponse acsResponse = client.getAcsResponse(request); log.info(acsResponse.toString()); }
说明UpdateFolder可以修改文件夹的名称,DeleteFolder删除数据开发页面的文件夹(要确保此文件夹下的节点已经全部删除)。
创建、提交、发布节点。
创建节点。
public void createFile() throws ClientException{ CreateFileRequest request = new CreateFileRequest(); request.setProjectId(78837L); request.setProjectIdentifier("zxy_8221431"); request.setFileName("test_vi_file_name2"); request.setFileDescription("Description"); request.setFileFolderPath("业务流程/test_create_business/通用/test_floder_123"); //节点类型。节点类型要符合目录类型。例如:fileType=23的离线同步节点,应该在数据集成目录下。 request.setFileType(99); // 文件依赖的上游文件的输出,此处依赖根节点projectIdentifier_root。必填,不然无法提交。 request.setInputList("zxy_8221431_root"); // 对应ide页面调度配置重跑类型。必填,不然无法提交。 //ALL_ALLOWED(运行成功或失败后皆可重跑) //FAILURE_ALLOWED(运行成功后不可重跑,运行失败后可以重跑) //ALL_DENIED(运行成功或失败皆不可重跑) request.setRerunMode("ALL_ALLOWED"); CreateFileResponse acsResponse = client.getAcsResponse(request); // acsResponse.getData() 为节点id 提交节点时使用 Long fileId = acsResponse.getData(); log.info(acsResponse.toString()); }
说明节点类型要符合目录类型。例如fileType=23的离线同步节点,应该在数据集成目录下。
您可以通过ListFile查询对应文件,GetFile获取文件的详情。
在调用UpdateFile更新已有的文件节点时,填写的参数必须和该节点原本的文件配置不同。例如源节点的某参数值为A,则需要变更为B后再提交。如果仍填写A,会报invalid异常。
提交节点。
public void submitFile() throws ClientException{ SubmitFileRequest request = new SubmitFileRequest(); request.setProjectId(78837L); request.setProjectIdentifier("zxy_8221431"); // 此节点id为创建节点时返回的id,对应数据库file表的file_id,不是数据开发页面上调度配置里的节点Id。 request.setFileId(501576542L); request.setComment("备注"); SubmitFileResponse acsResponse = client.getAcsResponse(request); // 调用GetDeployment接口获取本次发布的具体情况。 Long deploymentId = acsResponse.getData(); log.info(acsResponse.toString()); }
说明若项目空间是标准模式,则还需要发布节点到生产环境。在删除节点时标准环境中要把删除操作发布到生成环境,在提交节点或发布节点后可以调用GetDeployment获取发布包的详情。
发布节点。
public void deploy() throws ClientException{ DeployFileRequest request = new DeployFileRequest(); // request.setProjectId(78837L); request.setProjectIdentifier("zxy_8221431"); request.setFileId(501576542L); request.setComment("备注"); // 和file_id二选一。NodeId的值为数据开发页面调度配置里基础属性中的节点Id。 request.setNodeId(700004537241L); DeployFileResponse acsResponse = client.getAcsResponse(request); // 调用GetDeployment接口,获取本次发布的具体情况。 Long deploymentId = acsResponse.getData(); log.info(acsResponse.getData().toString()); }
说明如果项目空间是简单模式,则不区分生产和开发环境,只需要调用提交接口即可。
获取发布包详情。
public void getDeployment() throws ClientException{ GetDeploymentRequest request = new GetDeploymentRequest(); request.setProjectId(78837L); request.setProjectIdentifier("zxy_8221431"); //deploymentId为提交、发布的返回值。 request.setDeploymentId(2776067L); GetDeploymentResponse acsResponse = client.getAcsResponse(request); log.info(acsResponse.getData().toString()); }
说明在提交和发布时,Response会返回deploymentId,此接口可获取发布包的详情。当返回状态为1时则表示发布成功,详细返回参数定义参考GetDeployment。
删除节点。
public void deleteFile() throws ClientException{ DeleteFileRequest request = new DeleteFileRequest(); request.setProjectId(78837L); request.setProjectIdentifier("zxy_8221431"); request.setFileId(501576542L); DeleteFileResponse acsResponse = client.getAcsResponse(request); log.info(acsResponse.toString()); // 标准模式需要把删除发布到线上。 DeployFileRequest deployFileRequest = new DeployFileRequest(); request.setProjectId(78837L); deployFileRequest.setProjectIdentifier("zxy_8221431"); deployFileRequest.setFileId(501576542L); deployFileRequest.setComment("备注"); // 和file_id二选一。nodeId 的值为数据开发页面调度配置里基础属性中节点Id。 deployFileRequest.setNodeId(700004537241L); DeployFileResponse deployFileResponse = client.getAcsResponse(deployFileRequest); Long deploymentId = deployFileResponse.getData(); log.info(deployFileResponse.getData().toString()); }
说明在标准模式中删除节点是需调用发布接口DeployFileRequest,将删除操作发布到线上。
删除文件夹。
删除文件夹是要先删除文件夹下所有节点和文件夹。ListFilesRequest可以查询文件夹下的所有节点,逐个删除后才能删除文件夹。调用接口顺序为如下。
ListFolders查询要删除的文件夹ID和对应的文件夹的路径。
ListFiles查询此文件夹路径下所有的节点信息。
DeleteFile删除所有节点。若为标准环境,还要调用deploy接口将删除操作发布到线上。
DeleteFolder删除文件夹。
public void deleteFolder() throws ClientException{ //删除之前要先删除此目录下到所有节点。listFile查询节点。 List<ListFilesResponse.Data.File> files = listFiles(); for (ListFilesResponse.Data.File file : files) { //删除此文件夹下所有节点。 deleteFile(file); } DeleteFolderRequest request = new DeleteFolderRequest(); request.setProjectId(78837L); request.setProjectIdentifier("zxy_8221431"); //调用listFolders获取folderId。 request.setFolderId("*****"); DeleteFolderResponse acsResponse = client.getAcsResponse(request); log.info(acsResponse.toString()); } /** * 查询节点 * @return * @throws ClientException */ public List<ListFilesResponse.Data.File> listFiles() throws ClientException{ ListFilesRequest request = new ListFilesRequest(); request.setProjectId(78837L); request.setProjectIdentifier("zxy_8221431"); request.setPageNumber(1); request.setPageSize(10); request.setFileFolderPath("业务流程/test_create_business/通用/test_floder_123"); //关键字匹配。 //request.setKeyword(""); //文件所属的功能模块,包括NORMAL(数据开发)、MANUAL(手动任务)、MANUAL_BIZ(手动工作流)、SKIP(数据开发空跑调度)、ADHOCQUERY(临时查询)和COMPONENT(组件管理) request.setUseType("NORMAL"); //节点类型。多个用逗号分开。 request.setFileTypes("10,23,99"); ListFilesResponse acsResponse = client.getAcsResponse(request); return acsResponse.getData().getFiles(); } /** * 查询文件夹 * @return * @throws ClientException */ public List<ListFoldersResponse.Data.FoldersItem> listFolders() throws ClientException{ ListFoldersRequest request = new ListFoldersRequest(); request.setProjectId(78837L); request.setProjectIdentifier("zxy_8221431"); request.setPageNumber(1); request.setPageSize(10); //父文件夹的路径。 request.setParentFolderPath("业务流程/test_create_business/通用"); ListFoldersResponse acsResponse = client.getAcsResponse(request); return acsResponse.getData().getFolders(); }
删除业务流程。
删除业务流程时也要删除此业务流程下掉所有节点。调用接口顺序为如下。
ListFiles 查询业务流程下所有的节点信息。
DeleteFile删除所有节点。若为标准环境,还要调用deploy接口将删除操作发布到线上。
DeleteFolder删除文件夹。
public void deleteBusiness() throws ClientException{ //要先删除此业务流程下所有节点。 DeleteBusinessRequest request = new DeleteBusinessRequest(); request.setProjectId(78837L); request.setProjectIdentifier("zxy_8221431"); //调用ListBusiness接口,根据名称查询对应业务流程的ID。 List<ListBusinessResponse.Data.BusinessItem> businessItems = listBusiness(); request.setBusinessId(businessItems.get(0).getBusinessId()); DeleteBusinessResponse acsResponse = client.getAcsResponse(request); log.info(acsResponse.toString()); } public List<ListBusinessResponse.Data.BusinessItem> listBusiness() throws ClientException{ ListBusinessRequest request = new ListBusinessRequest(); request.setProjectId(78837L); request.setProjectIdentifier("zxy_8221431"); request.setPageNumber(1); request.setPageSize(10); request.setKeyword("test_create"); ListBusinessResponse acsResponse = client.getAcsResponse(request); return acsResponse.getData().getBusiness(); }