DolphinScheduler二次开发

1.目的:将ds的数据库连接管理中心的数据库连接信息同步生成脚本同步到shell脚本中。

2.分析:

在DataSource创建的基础上 同时调用生成脚本并保存

创建脚本接口分析

url : http://192.168.18.51:12345/dolphinscheduler/resources/online-create

首先到controller层进行定位 接口传参如下:

type: FILE
pid: 81
currentDir: /bigdata/etl/common
fileName: testDataSource
suffix: sh
description: 测试dataSource
content: #!/bin/bash

3: 源码追踪

追踪到serviceImpl层

onlineCreateResource

// ResourceController 
/***
*content 脚本内容 
*loginUser 登录用户
* type udf or file 
*/
return resourceService.onlineCreateResource(loginUser, type, fileName, fileSuffix, description, content, pid, currentDir);

跟进到 ResourcesServiceImple 保存记录到mysql 并且将内容生成文件上传到hdfs

// save data
Date now = new Date();
Resource resource = new Resource(pid, name, fullName, false, desc, name, loginUser.getId(), type, content.getBytes().length, now, now);

resourcesMapper.insert(resource);
updateParentResourceSize(resource, resource.getSize());

putMsg(result, Status.SUCCESS);
Map<String, Object> resultMap = new HashMap<>();
for (Map.Entry<Object, Object> entry : new BeanMap(resource).entrySet()) {
    if (!Constants.CLASS.equalsIgnoreCase(entry.getKey().toString())) {
        resultMap.put(entry.getKey().toString(), entry.getValue());
    }
}
result.setData(resultMap);
// tenantCode 租户编码 如hdfs 是保存用户组信息
String tenantCode = tenantMapper.queryById(loginUser.getTenantId()).getTenantCode();

result = uploadContentToStorage(fullName, tenantCode, content);
if (!result.getCode().equals(Status.SUCCESS.getCode())) {
    throw new ServiceException(result.getMsg());
}
return result;

在DataSourceServiceImpl 中添加

在dataSource实体insert成功后 创建资源目录

调用afterCreateDataSource方法

实现如下:

/**
 * @author LBQ
 * @date 2022-06-27
 * @description: 描述: 将数据源中心与资源中心连接起来
 */
private void afterCreateDataSource(User loginUser) {

   //TODO 修改 在保存dataSource后同时创建生成 shell 脚本并且保存
   // TODO  先进行resource查询 查询出父资源ID 不存在则创建
   // TODO 有可能需要递归创建 使用/datasource目录
   // resourcesService.createDirectory()
   Result<Object> queryResource = resourcesService.queryResource("/datasource", null, ResourceType.FILE);
   int pid = 0;
   // 该目录不存在 根目录id -1
   if (queryResource.getCode() != 0) {
      logger.info("目录/datasource不存在,现在进行目录创建操作!");
      Result<Object> createResult = resourcesService.createDirectory(loginUser, "/datasource", "资源中心连接信息", ResourceType.FILE, -1, "/");
      // 创建目录失败
      if (createResult.getCode() != 0) {
         logger.error("创建/datasource目录失败,请检查当前用户:{}是否有权限进行目录操作!", loginUser.getUserName());
      }
   } else {
      Resource resource = (Resource) queryResource.getData();
      pid = resource.getPid();
   }
   ResourceType resourceType = ResourceType.FILE;
   String fileName = "DATA_SOURCE";
   String fileSuffix = "sh";
   String desc = "资源中心连接信息";
   String content = "#!/bin/bash";
   String currentDir = "/datasource";
   // pid 怎么获取
   if (pid != 0) {
      resourcesService.onlineCreateResource(loginUser, resourceType, fileName, fileSuffix, desc, content, pid, currentDir);
   }else{
       logger.warn("无法创建资源目录及资源文件,无法获取pid信息!");
       }
}

 同理后续需要对 update delete 等操作做同步资源文件操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值