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 等操作做同步资源文件操作