最佳实践:文件管理OpenAPI基础实践

本篇文章将详细介绍DataWorks OpenAPI从初始化客户端、创建业务流程以及节点发布上线,再到删除节点和业务流程,帮助您快速上手使用DataWorks OpenAPI。

背景信息

DataWorks OpenAPI进行数据开发时,整体流程如下图所示。

image

操作步骤

  1. 初始化客户端。

    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);
        }
    }   
  2. 创建业务流程。

    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());
    }
    说明
    • UpdateBusinessDeleteBusiness可以修改和删除业务流程,删除业务流程是要保证指定的业务流程中所有的节点已经删除。

    • ListBusiness可以查看指定工作空间下符合匹配条件的所有业务流程。

    • GetBusiness可以查看查询业务流程的详情。

  3. 创建文件夹。

    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删除数据开发页面的文件夹(要确保此文件夹下的节点已经全部删除)。

  4. 创建、提交、发布节点。

    1. 创建节点。

      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异常。

    2. 提交节点。

       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获取发布包的详情。

    3. 发布节点。

       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());
          }
      说明

      如果项目空间是简单模式,则不区分生产和开发环境,只需要调用提交接口即可。

  5. 获取发布包详情。

    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

  6. 删除节点。

    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,将删除操作发布到线上。

  7. 删除文件夹。

    删除文件夹是要先删除文件夹下所有节点和文件夹。ListFilesRequest可以查询文件夹下的所有节点,逐个删除后才能删除文件夹。调用接口顺序为如下。

    1. ListFolders查询要删除的文件夹ID和对应的文件夹的路径。

    2. ListFiles查询此文件夹路径下所有的节点信息。

    3. DeleteFile删除所有节点。若为标准环境,还要调用deploy接口将删除操作发布到线上。

    4. 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();
        }
  8. 删除业务流程。

    删除业务流程时也要删除此业务流程下掉所有节点。调用接口顺序为如下。

    1. ListFiles 查询业务流程下所有的节点信息。

    2. DeleteFile删除所有节点。若为标准环境,还要调用deploy接口将删除操作发布到线上。

    3. 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();
        }