Commit d54a9076 by yuwei

项目初始化

parent b07012f4
......@@ -108,6 +108,18 @@ spring:
args:
name: dataApiMappingHystrix
fallbackUri: forward:/fallback
# 元数据管理
- id: datax-service-data-metadata
uri: lb://datax-service-data-metadata
predicates:
- Path=/data/metadata/**
filters:
- SwaggerHeaderFilter
- StripPrefix=2
- name: Hystrix
args:
name: dataMetadataHystrix
fallbackUri: forward:/fallback
# 定时任务
- id: datax-service-quartz
uri: lb://datax-service-quartz
......
# 数据源配置
spring:
redis:
database: 1
host: localhost
port: 6379
password: 1234@abcd # 密码(默认为空)
timeout: 6000ms # 连接超时时长(毫秒)
lettuce:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
datasource:
dynamic:
type: com.zaxxer.hikari.HikariDataSource
hikari:
auto-commit: false
connection-timeout: 30000
idle-timeout: 25000
login-timeout: 5
max-lifetime: 30000
read-only: false
validation-timeout: 3000
maximum-pool-size: 15
minimum-idle: 5
pool-name: DataxHikariCP
connection-test-query: SELECT 1 FROM DUAL
data-source-properties:
cachePrepStmts: true
prepStmtCacheSize: 250
prepStmtCacheSqlLimit: 2048
useServerPrepStmts: true
useLocalSessionState: true
rewriteBatchedStatements: true
cacheResultSetMetadata: true
cacheServerConfiguration: true
elideSetAutoCommits: true
maintainTimeStats: false
primary: mysql
datasource:
mysql:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://localhost:3306/data_cloud?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 1234@abcd
mybatis-plus:
mapper-locations: classpath*:mapper/*Mapper.xml
type-aliases-package: cn.datax.service.data.metadata.api.entity
global-config:
db-config:
id-type: ASSIGN_ID
banner: false
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
call-setters-on-nulls: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# spring security 配置
security:
oauth2:
client:
access-token-uri: http://localhost:8612/auth/oauth/token
user-authorization-uri: http://localhost:8612/auth/oauth/authorize
client-id: datax
client-secret: 123456
scope: all
resource:
loadBalanced: true
token-info-uri: http://localhost:8612/auth/oauth/check_token
# Swagger界面内容配置
swagger:
title: API接口文档
description: Api Documentation
version: 1.0.0
basePackage: cn.datax.service.data.metadata.controller
termsOfServiceUrl: http://www.baidu.com
contact:
name: yuwei
url: http://www.baidu.com
email: 312075478@qq.com
\ No newline at end of file
......@@ -45,4 +45,9 @@ public class DataSourceEntity extends DataScopeBaseEntity {
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private DbSchema dbSchema;
/**
* 元数据同步1是0否
*/
private Integer sourceSync;
}
......@@ -5,10 +5,14 @@ import cn.datax.service.data.factory.api.feign.factory.DataSourceServiceFeignFal
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
@FeignClient(contextId = "dataSourceServiceFeign", value = "datax-service-data-factory", fallbackFactory = DataSourceServiceFeignFallbackFactory.class)
public interface DataSourceServiceFeign {
@GetMapping("/inner/sources/{id}")
DataSourceEntity getDataSourceById(@PathVariable("id") String id);
@PutMapping("/inner/sources/sync/{id}")
void updateDataSourceSyncById(@PathVariable("id") String id);
}
......@@ -29,4 +29,5 @@ public class DataSourceVo implements Serializable {
private String sourceName;
private String themeId;
private DbSchema dbSchema;
private Integer sync;
}
......@@ -6,10 +6,7 @@ import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.service.DataSetService;
import cn.datax.service.data.factory.service.DataSourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/inner")
......@@ -27,6 +24,11 @@ public class InnerController extends BaseController {
return dataSourceEntity;
}
@PutMapping("/sources/sync/{id}")
public void updateDataSourceSyncById(@PathVariable("id") String id) {
dataSourceService.updateDataSourceSyncById(id);
}
@GetMapping("/sets/{id}")
public DataSetEntity getDataSetById(@PathVariable("id") String id) {
DataSetEntity dataSetEntity = dataSetService.getDataSetById(id);
......
......@@ -36,4 +36,6 @@ public interface DataSourceService extends BaseService<DataSourceEntity> {
List<DbTable> getDbTables(String id);
List<DbColumn> getDbTableColumns(String id, String tableName);
void updateDataSourceSyncById(String id);
}
package cn.datax.service.data.factory.service.impl;
import cn.datax.common.core.DataConstant;
import cn.datax.common.database.DataSourceFactory;
import cn.datax.common.database.DbQuery;
import cn.datax.common.database.constants.DbQueryProperty;
......@@ -113,4 +114,12 @@ public class DataSourceServiceImpl extends BaseServiceImpl<DataSourceDao, DataSo
List<DbColumn> columns = dbQuery.getTableColumns(dbSchema.getDbName(), tableName);
return columns;
}
@Override
public void updateDataSourceSyncById(String id) {
DataSourceEntity dataSource = new DataSourceEntity();
dataSource.setId(id);
dataSource.setSourceSync(Integer.valueOf(DataConstant.TrueOrFalse.TRUE.getKey()));
dataSourceDao.updateById(dataSource);
}
}
......@@ -15,6 +15,7 @@
<result column="db_type" property="dbType" />
<result column="source_name" property="sourceName" />
<result column="theme_id" property="themeId" />
<result column="source_sync" property="sourceSync" />
<result column="db_schema" property="dbSchema" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />
</resultMap>
......@@ -28,7 +29,7 @@
update_by,
update_time,
remark,
db_type, source_name, theme_id, db_schema
db_type, source_name, theme_id, source_sync, db_schema
</sql>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>data-metadata-service-parent</artifactId>
<groupId>cn.datax</groupId>
<version>2.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<version>2.0.0</version>
<artifactId>data-metadata-service-api</artifactId>
<dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
<!--feign 依赖-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-core</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package cn.datax.service.data.metadata.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* <p>
* 元数据信息表 实体DTO
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@ApiModel(value = "元数据信息表Model")
@Data
public class DataMetadataColumnDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "所属数据源")
private String sourceId;
@ApiModelProperty(value = "所属数据表")
private String tableId;
@ApiModelProperty(value = "字段名称")
private String columnName;
@ApiModelProperty(value = "字段注释")
private String columnComment;
@ApiModelProperty(value = "字段是否主键(1是0否)")
private String columnKey;
@ApiModelProperty(value = "字段是否允许为空(1是0否)")
private String columnNullable;
@ApiModelProperty(value = "字段序号")
private String columnPosition;
@ApiModelProperty(value = "数据类型")
private String dataType;
@ApiModelProperty(value = "数据长度")
private String dataLength;
@ApiModelProperty(value = "数据精度")
private String dataPrecision;
@ApiModelProperty(value = "数据小数位")
private String dataScale;
@ApiModelProperty(value = "数据默认值")
private String dataDefault;
}
package cn.datax.service.data.metadata.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* <p>
* 数据库表信息表 实体DTO
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@ApiModel(value = "数据库表信息表Model")
@Data
public class DataMetadataTableDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "所属数据源")
private String sourceId;
@ApiModelProperty(value = "表名")
private String tableName;
}
package cn.datax.service.data.metadata.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import cn.datax.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 元数据信息表
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("data_metadata_column")
public class DataMetadataColumnEntity extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 所属数据源
*/
private String sourceId;
/**
* 所属数据表
*/
private String tableId;
/**
* 字段名称
*/
private String columnName;
/**
* 字段注释
*/
private String columnComment;
/**
* 字段是否主键(1是0否)
*/
private String columnKey;
/**
* 字段是否允许为空(1是0否)
*/
private String columnNullable;
/**
* 字段序号
*/
private String columnPosition;
/**
* 数据类型
*/
private String dataType;
/**
* 数据长度
*/
private String dataLength;
/**
* 数据精度
*/
private String dataPrecision;
/**
* 数据小数位
*/
private String dataScale;
/**
* 数据默认值
*/
private String dataDefault;
}
package cn.datax.service.data.metadata.api.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import cn.datax.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 数据库表信息表
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("data_metadata_table")
public class DataMetadataTableEntity extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 所属数据源
*/
private String sourceId;
/**
* 表名
*/
private String tableName;
}
package cn.datax.service.data.metadata.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 元数据信息表 查询实体
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class DataMetadataColumnQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
private String sourceId;
private String tableId;
private String columnName;
}
package cn.datax.service.data.metadata.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 数据库表信息表 查询实体
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class DataMetadataTableQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
private String sourceId;
private String tableName;
}
package cn.datax.service.data.metadata.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 元数据信息表 实体VO
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Data
public class DataMetadataColumnVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private Integer status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String sourceId;
private String tableId;
private String columnName;
private String columnComment;
private String columnKey;
private String columnNullable;
private String columnPosition;
private String dataType;
private String dataLength;
private String dataPrecision;
private String dataScale;
private String dataDefault;
}
package cn.datax.service.data.metadata.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 数据库表信息表 实体VO
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Data
public class DataMetadataTableVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private Integer status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String sourceId;
private String tableName;
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>data-metadata-service-parent</artifactId>
<groupId>cn.datax</groupId>
<version>2.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<version>2.0.0</version>
<artifactId>data-metadata-service</artifactId>
<dependencies>
<!--web 模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<!--配置中心客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-mybatis</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-redis</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-security</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-database</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-log</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>data-metadata-service-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>data-factory-service-api</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package cn.datax.service.data.metadata;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients(basePackages = {"cn.datax.service.system.api.feign", "cn.datax.service.data.factory.api.feign"})
@SpringCloudApplication
public class DataxMetadataApplication {
public static void main(String[] args) {
SpringApplication.run(DataxMetadataApplication.class);
}
}
package cn.datax.service.data.metadata.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@EnableAsync
@Configuration
public class AsyncConfig {
@Bean("taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(100);
executor.setKeepAliveSeconds(30);
executor.setThreadNamePrefix("datax-async-service-");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
\ No newline at end of file
package cn.datax.service.data.metadata.config;
import cn.datax.common.security.handler.DataAccessDeniedHandler;
import cn.datax.common.security.handler.DataAuthExceptionEntryPoint;
import cn.datax.common.security.utils.DataRedisTokenServices;
import cn.datax.common.security.utils.RedisTokenStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class DataResourceServerConfig extends ResourceServerConfigurerAdapter {
@Autowired
private DataAccessDeniedHandler accessDeniedHandler;
@Autowired
private DataAuthExceptionEntryPoint exceptionEntryPoint;
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public TokenStore redisTokenStore() {
return new RedisTokenStore(redisConnectionFactory);
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
DataRedisTokenServices dataTokenServices = new DataRedisTokenServices();
dataTokenServices.setTokenStore(redisTokenStore());
resources
.tokenStore(redisTokenStore())
.tokenServices(dataTokenServices)
.authenticationEntryPoint(exceptionEntryPoint)
.accessDeniedHandler(accessDeniedHandler);
}
@Override
public void configure(HttpSecurity http) throws Exception {
//允许使用iframe 嵌套,避免swagger-ui 不被加载的问题
http.headers().frameOptions().disable();
http.authorizeRequests()
.antMatchers(
"/actuator/**",
"/v2/api-docs/**",
"/swagger-ui.html",
"/doc.html",
"/swagger-resources/**",
"/webjars/**",
// feign 内部调用不用授权
"/inner/**"
).permitAll()
.anyRequest().authenticated()
.and().csrf().disable();
}
}
package cn.datax.service.data.metadata.config;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Component
@RequiredArgsConstructor
public class StartedUpRunner implements ApplicationRunner {
private final ConfigurableApplicationContext context;
private final Environment environment;
@Override
public void run(ApplicationArguments args) {
if (context.isActive()) {
String banner = "-----------------------------------------\n" +
"服务启动成功,时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()) + "\n" +
"服务名称:" + environment.getProperty("spring.application.name") + "\n" +
"端口号:" + environment.getProperty("server.port") + "\n" +
"-----------------------------------------";
System.out.println(banner);
}
}
}
package cn.datax.service.data.metadata.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
@Configuration
@ConditionalOnProperty(prefix = "swagger", name = "enable", havingValue = "true")
@EnableConfigurationProperties(SwaggerProperties.class)
@EnableSwagger2
public class SwaggerConfig {
@Autowired
private SwaggerProperties swaggerProperties;
/**
* 创建API应用
* apiInfo() 增加API相关信息
* 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
* 本例采用指定扫描的包路径来定义指定要建立API的目录。
*
* @return
*/
@Bean
public Docket createRestApi(){
//版本类型是swagger2
return new Docket(DocumentationType.SWAGGER_2)
//通过调用自定义方法apiInfo,获得文档的主要信息
.apiInfo(apiInfo())
//设置全局参数
.globalOperationParameters(globalParamBuilder())
//设置全局响应参数
.globalResponseMessage(RequestMethod.GET,responseBuilder())
.globalResponseMessage(RequestMethod.POST,responseBuilder())
.globalResponseMessage(RequestMethod.PUT,responseBuilder())
.globalResponseMessage(RequestMethod.DELETE,responseBuilder())
.select()
//扫描该包下面的API注解
.apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage()))
.paths(PathSelectors.any())
.build()
//设置安全认证
.securitySchemes(security());
}
/**
* 创建该API的基本信息(这些基本信息会展现在文档页面中)
* 访问地址:http://项目实际地址/swagger-ui.html
* @return
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title(swaggerProperties.getTitle())
.description(swaggerProperties.getDescription())
.termsOfServiceUrl(swaggerProperties.getTermsOfServiceUrl())
.version(swaggerProperties.getVersion())
.contact(new Contact(swaggerProperties.getContact().getName(), swaggerProperties.getContact().getUrl(), swaggerProperties.getContact().getEmail()))
.build();
}
/**
* 安全认证参数
* @return
*/
private List<ApiKey> security() {
List<ApiKey> apiKeys = new ArrayList<>();
apiKeys.add(new ApiKey("Authorization", "Authorization", "header"));
return apiKeys;
}
/**
* 构建全局参数列表
* @return
*/
private List<Parameter> globalParamBuilder(){
List<Parameter> pars = new ArrayList<>();
pars.add(parameterBuilder("Authorization","令牌","string","header",false).build());
return pars;
}
/**
* 创建参数
* @return
*/
private ParameterBuilder parameterBuilder(String name, String desc, String type, String parameterType, boolean required) {
ParameterBuilder tokenPar = new ParameterBuilder();
tokenPar.name(name).description(desc).modelRef(new ModelRef(type)).parameterType(parameterType).required(required).build();
return tokenPar;
}
/**
* 创建全局响应值
* @return
*/
private List<ResponseMessage> responseBuilder() {
List<ResponseMessage> responseMessageList = new ArrayList<>();
responseMessageList.add(new ResponseMessageBuilder().code(200).message("响应成功").build());
responseMessageList.add(new ResponseMessageBuilder().code(500).message("服务器内部错误").build());
return responseMessageList;
}
}
package cn.datax.service.data.metadata.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(ignoreUnknownFields = false, prefix = "swagger")
public class SwaggerProperties {
private String title;
private String description;
private String version;
private String termsOfServiceUrl;
private String basePackage;
private Contact contact;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getTermsOfServiceUrl() {
return termsOfServiceUrl;
}
public void setTermsOfServiceUrl(String termsOfServiceUrl) {
this.termsOfServiceUrl = termsOfServiceUrl;
}
public String getBasePackage() {
return basePackage;
}
public void setBasePackage(String basePackage) {
this.basePackage = basePackage;
}
public Contact getContact() {
return contact;
}
public void setContact(Contact contact) {
this.contact = contact;
}
public static class Contact {
private String name;
private String url;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
}
package cn.datax.service.data.metadata.controller;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.metadata.api.dto.DataMetadataColumnDto;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity;
import cn.datax.service.data.metadata.api.vo.DataMetadataColumnVo;
import cn.datax.service.data.metadata.api.query.DataMetadataColumnQuery;
import cn.datax.service.data.metadata.mapstruct.DataMetadataColumnMapper;
import cn.datax.service.data.metadata.service.DataMetadataColumnService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 元数据信息表 前端控制器
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Api(tags = {"元数据信息表"})
@RestController
@RequestMapping("/columns")
public class DataMetadataColumnController extends BaseController {
@Autowired
private DataMetadataColumnService dataMetadataColumnService;
@Autowired
private DataMetadataColumnMapper dataMetadataColumnMapper;
/**
* 通过ID查询信息
*
* @param id
* @return
*/
@ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}")
public R getDataMetadataColumnById(@PathVariable String id) {
DataMetadataColumnEntity dataMetadataColumnEntity = dataMetadataColumnService.getDataMetadataColumnById(id);
return R.ok().setData(dataMetadataColumnMapper.toVO(dataMetadataColumnEntity));
}
@ApiOperation(value = "获取列表", notes = "")
@GetMapping("/list")
public R getDataMetadataColumnList(DataMetadataColumnQuery dataMetadataColumnQuery) {
QueryWrapper<DataMetadataColumnEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataMetadataColumnQuery.getColumnName()), "column_name", dataMetadataColumnQuery.getColumnName());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataColumnQuery.getSourceId()), "source_id", dataMetadataColumnQuery.getSourceId());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataColumnQuery.getTableId()), "table_id", dataMetadataColumnQuery.getTableId());
List<DataMetadataColumnEntity> list = dataMetadataColumnService.list(queryWrapper);
List<DataMetadataColumnVo> collect = list.stream().map(dataMetadataColumnMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect);
}
/**
* 分页查询信息
*
* @param dataMetadataColumnQuery
* @return
*/
@ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({
@ApiImplicitParam(name = "dataMetadataColumnQuery", value = "查询实体dataMetadataColumnQuery", required = true, dataTypeClass = DataMetadataColumnQuery.class)
})
@GetMapping("/page")
public R getDataMetadataColumnPage(DataMetadataColumnQuery dataMetadataColumnQuery) {
QueryWrapper<DataMetadataColumnEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataMetadataColumnQuery.getColumnName()), "column_name", dataMetadataColumnQuery.getColumnName());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataColumnQuery.getSourceId()), "source_id", dataMetadataColumnQuery.getSourceId());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataColumnQuery.getTableId()), "table_id", dataMetadataColumnQuery.getTableId());
IPage<DataMetadataColumnEntity> page = dataMetadataColumnService.page(new Page<>(dataMetadataColumnQuery.getPageNum(), dataMetadataColumnQuery.getPageSize()), queryWrapper);
List<DataMetadataColumnVo> collect = page.getRecords().stream().map(dataMetadataColumnMapper::toVO).collect(Collectors.toList());
JsonPage<DataMetadataColumnVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage);
}
/**
* 添加
* @param dataMetadataColumn
* @return
*/
@ApiOperation(value = "添加信息", notes = "根据dataMetadataColumn对象添加信息")
@ApiImplicitParam(name = "dataMetadataColumn", value = "详细实体dataMetadataColumn", required = true, dataType = "DataMetadataColumnDto")
@PostMapping()
public R saveDataMetadataColumn(@RequestBody @Validated({ValidationGroups.Insert.class}) DataMetadataColumnDto dataMetadataColumn) {
DataMetadataColumnEntity dataMetadataColumnEntity = dataMetadataColumnService.saveDataMetadataColumn(dataMetadataColumn);
return R.ok().setData(dataMetadataColumnMapper.toVO(dataMetadataColumnEntity));
}
/**
* 修改
* @param dataMetadataColumn
* @return
*/
@ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "dataMetadataColumn", value = "详细实体dataMetadataColumn", required = true, dataType = "DataMetadataColumnDto")
})
@PutMapping("/{id}")
public R updateDataMetadataColumn(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) DataMetadataColumnDto dataMetadataColumn) {
DataMetadataColumnEntity dataMetadataColumnEntity = dataMetadataColumnService.updateDataMetadataColumn(dataMetadataColumn);
return R.ok().setData(dataMetadataColumnMapper.toVO(dataMetadataColumnEntity));
}
/**
* 删除
* @param id
* @return
*/
@ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}")
public R deleteDataMetadataColumnById(@PathVariable String id) {
dataMetadataColumnService.deleteDataMetadataColumnById(id);
return R.ok();
}
/**
* 批量删除
* @param ids
* @return
*/
@ApiOperation(value = "批量删除角色", notes = "根据url的ids来批量删除对象")
@ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path")
@DeleteMapping("/batch/{ids}")
public R deleteDataMetadataColumnBatch(@PathVariable List<String> ids) {
dataMetadataColumnService.deleteDataMetadataColumnBatch(ids);
return R.ok();
}
}
package cn.datax.service.data.metadata.controller;
import cn.datax.common.core.R;
import cn.datax.service.data.metadata.service.DataMetadataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = {"元数据"})
@RestController
public class DataMetadataController {
@Autowired
private DataMetadataService dataMetadataService;
@ApiOperation(value = "同步", notes = "根据url的id来指定同步对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@PostMapping("/databases/{id}")
public R syncMetadata(@PathVariable String id) {
dataMetadataService.syncMetadata(id);
return R.ok();
}
}
package cn.datax.service.data.metadata.controller;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.metadata.api.dto.DataMetadataTableDto;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity;
import cn.datax.service.data.metadata.api.vo.DataMetadataTableVo;
import cn.datax.service.data.metadata.api.query.DataMetadataTableQuery;
import cn.datax.service.data.metadata.mapstruct.DataMetadataTableMapper;
import cn.datax.service.data.metadata.service.DataMetadataTableService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 数据库表信息表 前端控制器
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Api(tags = {"数据库表信息表"})
@RestController
@RequestMapping("/tables")
public class DataMetadataTableController extends BaseController {
@Autowired
private DataMetadataTableService dataMetadataTableService;
@Autowired
private DataMetadataTableMapper dataMetadataTableMapper;
/**
* 通过ID查询信息
*
* @param id
* @return
*/
@ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}")
public R getDataMetadataTableById(@PathVariable String id) {
DataMetadataTableEntity dataMetadataTableEntity = dataMetadataTableService.getDataMetadataTableById(id);
return R.ok().setData(dataMetadataTableMapper.toVO(dataMetadataTableEntity));
}
@ApiOperation(value = "获取列表", notes = "")
@GetMapping("/list")
public R getDataMetadataTableList(DataMetadataTableQuery dataMetadataTableQuery) {
QueryWrapper<DataMetadataTableEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataMetadataTableQuery.getTableName()), "table_name", dataMetadataTableQuery.getTableName());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataTableQuery.getSourceId()), "source_id", dataMetadataTableQuery.getSourceId());
List<DataMetadataTableEntity> list = dataMetadataTableService.list(queryWrapper);
List<DataMetadataTableVo> collect = list.stream().map(dataMetadataTableMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect);
}
/**
* 分页查询信息
*
* @param dataMetadataTableQuery
* @return
*/
@ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({
@ApiImplicitParam(name = "dataMetadataTableQuery", value = "查询实体dataMetadataTableQuery", required = true, dataTypeClass = DataMetadataTableQuery.class)
})
@GetMapping("/page")
public R getDataMetadataTablePage(DataMetadataTableQuery dataMetadataTableQuery) {
QueryWrapper<DataMetadataTableEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StrUtil.isNotBlank(dataMetadataTableQuery.getTableName()), "table_name", dataMetadataTableQuery.getTableName());
queryWrapper.eq(StrUtil.isNotBlank(dataMetadataTableQuery.getSourceId()), "source_id", dataMetadataTableQuery.getSourceId());
IPage<DataMetadataTableEntity> page = dataMetadataTableService.page(new Page<>(dataMetadataTableQuery.getPageNum(), dataMetadataTableQuery.getPageSize()), queryWrapper);
List<DataMetadataTableVo> collect = page.getRecords().stream().map(dataMetadataTableMapper::toVO).collect(Collectors.toList());
JsonPage<DataMetadataTableVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage);
}
/**
* 添加
* @param dataMetadataTable
* @return
*/
@ApiOperation(value = "添加信息", notes = "根据dataMetadataTable对象添加信息")
@ApiImplicitParam(name = "dataMetadataTable", value = "详细实体dataMetadataTable", required = true, dataType = "DataMetadataTableDto")
@PostMapping()
public R saveDataMetadataTable(@RequestBody @Validated({ValidationGroups.Insert.class}) DataMetadataTableDto dataMetadataTable) {
DataMetadataTableEntity dataMetadataTableEntity = dataMetadataTableService.saveDataMetadataTable(dataMetadataTable);
return R.ok().setData(dataMetadataTableMapper.toVO(dataMetadataTableEntity));
}
/**
* 修改
* @param dataMetadataTable
* @return
*/
@ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "dataMetadataTable", value = "详细实体dataMetadataTable", required = true, dataType = "DataMetadataTableDto")
})
@PutMapping("/{id}")
public R updateDataMetadataTable(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) DataMetadataTableDto dataMetadataTable) {
DataMetadataTableEntity dataMetadataTableEntity = dataMetadataTableService.updateDataMetadataTable(dataMetadataTable);
return R.ok().setData(dataMetadataTableMapper.toVO(dataMetadataTableEntity));
}
/**
* 删除
* @param id
* @return
*/
@ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}")
public R deleteDataMetadataTableById(@PathVariable String id) {
dataMetadataTableService.deleteDataMetadataTableById(id);
return R.ok();
}
/**
* 批量删除
* @param ids
* @return
*/
@ApiOperation(value = "批量删除角色", notes = "根据url的ids来批量删除对象")
@ApiImplicitParam(name = "ids", value = "ID集合", required = true, dataType = "List", paramType = "path")
@DeleteMapping("/batch/{ids}")
public R deleteDataMetadataTableBatch(@PathVariable List<String> ids) {
dataMetadataTableService.deleteDataMetadataTableBatch(ids);
return R.ok();
}
}
package cn.datax.service.data.metadata.controller;
import cn.datax.common.base.BaseController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/inner")
public class InnerController extends BaseController {
}
package cn.datax.service.data.metadata.dao;
import cn.datax.common.base.BaseDao;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 元数据信息表 Mapper 接口
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Mapper
public interface DataMetadataColumnDao extends BaseDao<DataMetadataColumnEntity> {
}
package cn.datax.service.data.metadata.dao;
import cn.datax.common.base.BaseDao;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 数据库表信息表 Mapper 接口
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Mapper
public interface DataMetadataTableDao extends BaseDao<DataMetadataTableEntity> {
}
package cn.datax.service.data.metadata.mapstruct;
import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.metadata.api.dto.DataMetadataColumnDto;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity;
import cn.datax.service.data.metadata.api.vo.DataMetadataColumnVo;
import org.mapstruct.Mapper;
/**
* <p>
* 元数据信息表 Mapper 实体映射
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Mapper(componentModel = "spring")
public interface DataMetadataColumnMapper extends EntityMapper<DataMetadataColumnDto, DataMetadataColumnEntity, DataMetadataColumnVo> {
}
package cn.datax.service.data.metadata.mapstruct;
import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.metadata.api.dto.DataMetadataTableDto;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity;
import cn.datax.service.data.metadata.api.vo.DataMetadataTableVo;
import org.mapstruct.Mapper;
/**
* <p>
* 数据库表信息表 Mapper 实体映射
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Mapper(componentModel = "spring")
public interface DataMetadataTableMapper extends EntityMapper<DataMetadataTableDto, DataMetadataTableEntity, DataMetadataTableVo> {
}
package cn.datax.service.data.metadata.service;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity;
import cn.datax.service.data.metadata.api.dto.DataMetadataColumnDto;
import cn.datax.common.base.BaseService;
import java.util.List;
/**
* <p>
* 元数据信息表 服务类
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
public interface DataMetadataColumnService extends BaseService<DataMetadataColumnEntity> {
DataMetadataColumnEntity saveDataMetadataColumn(DataMetadataColumnDto dataMetadataColumn);
DataMetadataColumnEntity updateDataMetadataColumn(DataMetadataColumnDto dataMetadataColumn);
DataMetadataColumnEntity getDataMetadataColumnById(String id);
void deleteDataMetadataColumnById(String id);
void deleteDataMetadataColumnBatch(List<String> ids);
}
package cn.datax.service.data.metadata.service;
public interface DataMetadataService {
void syncMetadata(String id);
}
package cn.datax.service.data.metadata.service;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity;
import cn.datax.service.data.metadata.api.dto.DataMetadataTableDto;
import cn.datax.common.base.BaseService;
import java.util.List;
/**
* <p>
* 数据库表信息表 服务类
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
public interface DataMetadataTableService extends BaseService<DataMetadataTableEntity> {
DataMetadataTableEntity saveDataMetadataTable(DataMetadataTableDto dataMetadataTable);
DataMetadataTableEntity updateDataMetadataTable(DataMetadataTableDto dataMetadataTable);
DataMetadataTableEntity getDataMetadataTableById(String id);
void deleteDataMetadataTableById(String id);
void deleteDataMetadataTableBatch(List<String> ids);
}
package cn.datax.service.data.metadata.service.impl;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity;
import cn.datax.service.data.metadata.api.dto.DataMetadataColumnDto;
import cn.datax.service.data.metadata.service.DataMetadataColumnService;
import cn.datax.service.data.metadata.mapstruct.DataMetadataColumnMapper;
import cn.datax.service.data.metadata.dao.DataMetadataColumnDao;
import cn.datax.common.base.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* <p>
* 元数据信息表 服务实现类
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class DataMetadataColumnServiceImpl extends BaseServiceImpl<DataMetadataColumnDao, DataMetadataColumnEntity> implements DataMetadataColumnService {
@Autowired
private DataMetadataColumnDao dataMetadataColumnDao;
@Autowired
private DataMetadataColumnMapper dataMetadataColumnMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public DataMetadataColumnEntity saveDataMetadataColumn(DataMetadataColumnDto dataMetadataColumnDto) {
DataMetadataColumnEntity dataMetadataColumn = dataMetadataColumnMapper.toEntity(dataMetadataColumnDto);
dataMetadataColumnDao.insert(dataMetadataColumn);
return dataMetadataColumn;
}
@Override
@Transactional(rollbackFor = Exception.class)
public DataMetadataColumnEntity updateDataMetadataColumn(DataMetadataColumnDto dataMetadataColumnDto) {
DataMetadataColumnEntity dataMetadataColumn = dataMetadataColumnMapper.toEntity(dataMetadataColumnDto);
dataMetadataColumnDao.updateById(dataMetadataColumn);
return dataMetadataColumn;
}
@Override
public DataMetadataColumnEntity getDataMetadataColumnById(String id) {
DataMetadataColumnEntity dataMetadataColumnEntity = super.getById(id);
return dataMetadataColumnEntity;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDataMetadataColumnById(String id) {
dataMetadataColumnDao.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDataMetadataColumnBatch(List<String> ids) {
dataMetadataColumnDao.deleteBatchIds(ids);
}
}
package cn.datax.service.data.metadata.service.impl;
import cn.datax.common.core.DataConstant;
import cn.datax.common.database.DataSourceFactory;
import cn.datax.common.database.DbQuery;
import cn.datax.common.database.constants.DbQueryProperty;
import cn.datax.common.database.core.DbColumn;
import cn.datax.common.database.core.DbTable;
import cn.datax.common.exception.DataException;
import cn.datax.service.data.factory.api.dto.DbSchema;
import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.api.feign.DataSourceServiceFeign;
import cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity;
import cn.datax.service.data.metadata.dao.DataMetadataColumnDao;
import cn.datax.service.data.metadata.dao.DataMetadataTableDao;
import cn.datax.service.data.metadata.service.DataMetadataService;
import cn.hutool.core.collection.CollUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
public class DataMetadataServiceImpl implements DataMetadataService {
@Autowired
private DataSourceFactory dataSourceFactory;
@Autowired
private DataSourceServiceFeign dataSourceServiceFeign;
@Autowired
private DataMetadataTableDao dataMetadataTableDao;
@Autowired
private DataMetadataColumnDao dataMetadataColumnDao;
@Override
public void syncMetadata(String id) {
DataSourceEntity dataSourceEntity = dataSourceServiceFeign.getDataSourceById(id);
if (dataSourceServiceFeign == null) {
throw new DataException("未找到数据源");
}
if (Integer.valueOf(DataConstant.TrueOrFalse.TRUE.getKey()).equals(dataSourceEntity.getSourceSync())) {
throw new DataException("元数据已同步");
}
// 异步执行同步任务
syncTask(dataSourceEntity);
}
@Async
public void syncTask(DataSourceEntity dataSource) {
long start = System.currentTimeMillis();
DbSchema dbSchema = dataSource.getDbSchema();
DbQueryProperty dbQueryProperty = new DbQueryProperty(dataSource.getDbType(), dbSchema.getHost(),
dbSchema.getUsername(), dbSchema.getPassword(), dbSchema.getPort(), dbSchema.getDbName(), dbSchema.getSid());
DbQuery dbQuery = dataSourceFactory.createDbQuery(dbQueryProperty);
List<DbTable> tables = dbQuery.getTables(dbSchema.getDbName());
if (CollUtil.isNotEmpty(tables)) {
List<DataMetadataTableEntity> metadataTableEntityList = tables.stream().map(table -> {
DataMetadataTableEntity metadataTable = new DataMetadataTableEntity();
metadataTable.setSourceId(dataSource.getId());
metadataTable.setTableName(table.getTableName());
return metadataTable;
}).collect(Collectors.toList());
if (CollUtil.isNotEmpty(metadataTableEntityList)) {
metadataTableEntityList.stream().forEach(table -> {
dataMetadataTableDao.insert(table);
List<DbColumn> columns = dbQuery.getTableColumns(dbSchema.getDbName(), table.getTableName());
if (CollUtil.isNotEmpty(columns)) {
List<DataMetadataColumnEntity> metadataColumnEntityList = columns.stream().map(column -> {
DataMetadataColumnEntity metadataColumn = new DataMetadataColumnEntity();
metadataColumn.setSourceId(dataSource.getId());
metadataColumn.setTableId(table.getId());
metadataColumn.setColumnName(column.getColName());
metadataColumn.setColumnComment(column.getColComment());
metadataColumn.setColumnKey(column.getColKey() ? "1" : "0");
metadataColumn.setColumnNullable(column.getNullable() ? "1" : "0");
metadataColumn.setColumnPosition(column.getColPosition().toString());
metadataColumn.setDataType(column.getDataType());
metadataColumn.setDataLength(column.getDataLength().toString());
metadataColumn.setDataPrecision(column.getDataPrecision().toString());
metadataColumn.setDataScale(column.getDataScale().toString());
metadataColumn.setDataDefault(column.getDataDefault());
return metadataColumn;
}).collect(Collectors.toList());
if (CollUtil.isNotEmpty(metadataColumnEntityList)) {
metadataColumnEntityList.stream().forEach(column -> dataMetadataColumnDao.insert(column));
}
}
});
}
}
log.info("异步任务执行完成!耗时{}秒", (System.currentTimeMillis() - start / 1000));
}
}
package cn.datax.service.data.metadata.service.impl;
import cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity;
import cn.datax.service.data.metadata.api.dto.DataMetadataTableDto;
import cn.datax.service.data.metadata.service.DataMetadataTableService;
import cn.datax.service.data.metadata.mapstruct.DataMetadataTableMapper;
import cn.datax.service.data.metadata.dao.DataMetadataTableDao;
import cn.datax.common.base.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* <p>
* 数据库表信息表 服务实现类
* </p>
*
* @author yuwei
* @since 2020-07-29
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class DataMetadataTableServiceImpl extends BaseServiceImpl<DataMetadataTableDao, DataMetadataTableEntity> implements DataMetadataTableService {
@Autowired
private DataMetadataTableDao dataMetadataTableDao;
@Autowired
private DataMetadataTableMapper dataMetadataTableMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public DataMetadataTableEntity saveDataMetadataTable(DataMetadataTableDto dataMetadataTableDto) {
DataMetadataTableEntity dataMetadataTable = dataMetadataTableMapper.toEntity(dataMetadataTableDto);
dataMetadataTableDao.insert(dataMetadataTable);
return dataMetadataTable;
}
@Override
@Transactional(rollbackFor = Exception.class)
public DataMetadataTableEntity updateDataMetadataTable(DataMetadataTableDto dataMetadataTableDto) {
DataMetadataTableEntity dataMetadataTable = dataMetadataTableMapper.toEntity(dataMetadataTableDto);
dataMetadataTableDao.updateById(dataMetadataTable);
return dataMetadataTable;
}
@Override
public DataMetadataTableEntity getDataMetadataTableById(String id) {
DataMetadataTableEntity dataMetadataTableEntity = super.getById(id);
return dataMetadataTableEntity;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDataMetadataTableById(String id) {
dataMetadataTableDao.deleteById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDataMetadataTableBatch(List<String> ids) {
dataMetadataTableDao.deleteBatchIds(ids);
}
}
server:
port: 8820
spring:
application:
name: datax-service-data-metadata
profiles:
active: dev
cloud:
config:
fail-fast: true
name: ${spring.application.name}
profile: ${spring.profiles.active}
discovery:
enabled: true
service-id: datax-config
# 注册中心配置
eureka:
instance:
lease-renewal-interval-in-seconds: 20
client:
register-with-eureka: true
fetch-registry: true
instance-info-replication-interval-seconds: 30
registry-fetch-interval-seconds: 3
service-url:
defaultZone: http://localhost:8610/eureka
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<springProperty scope="context" name="springAppName" source="spring.application.name"/>
<property name="log.path" value="logs/datax-service-data-metadata"/>
<property name="log.maxHistory" value="15"/>
<property name="log.totalSizeCap" value="500MB"/>
<property name="log.maxFileSize" value="10MB"/>
<property name="log.colorPattern"
value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %boldCyan(${springAppName:-}) %yellow(%thread) %green(%logger) %msg%n"/>
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level ${springAppName:-} %thread %logger %msg%n"/>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.colorPattern}</pattern>
</encoder>
</appender>
<!--输出到文件-->
<!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<!-- 以下的大概意思是:1.先按日期存日志,日期变了,将前一天的日志文件名重命名为XXX%日期%索引,新的日志仍然是project_info.log -->
<!-- 2.如果日期没有发生变化,但是当前日志的文件大小超过10MB时,对当前日志进行分割 重命名-->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志文件路径和名称-->
<File>${log.path}/info/info.log</File>
<!--是否追加到文件末尾,默认为true-->
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->
<!-- 文件名:logs/project_info.2017-12-05.0.log -->
<!-- 注意:SizeAndTimeBasedRollingPolicy中 %i和%d令牌都是强制性的,必须存在,要不会报错 -->
<fileNamePattern>${log.path}/info/info.%d.%i.log</fileNamePattern>
<!-- 每产生一个日志文件,该日志文件的保存期限为30天, ps:maxHistory的单位是根据fileNamePattern中的翻转策略自动推算出来的,例如上面选用了yyyy-MM-dd,则单位为天
如果上面选用了yyyy-MM,则单位为月,另外上面的单位默认为yyyy-MM-dd-->
<MaxHistory>${log.maxHistory}</MaxHistory>
<!-- 每个日志文件到2mb的时候开始切分,最多保留30天,但最大到500MB,哪怕没到30天也要删除多余的日志 -->
<totalSizeCap>${log.totalSizeCap}</totalSizeCap>
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,测试时可改成5KB看效果 -->
<maxFileSize>${log.maxFileSize}</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.path}/error/error.log</File>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error.%d.%i.log</fileNamePattern>
<MaxHistory>${log.maxHistory}</MaxHistory>
<totalSizeCap>${log.totalSizeCap}</totalSizeCap>
<maxFileSize>${log.maxFileSize}</maxFileSize>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="debug">
<appender-ref ref="console"/>
</root>
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.datax.service.data.metadata.dao.DataMetadataColumnDao">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.data.metadata.api.entity.DataMetadataColumnEntity">
<result column="id" property="id" />
<result column="status" property="status" />
<result column="create_by" property="createBy" />
<result column="create_time" property="createTime" />
<result column="update_by" property="updateBy" />
<result column="update_time" property="updateTime" />
<result column="remark" property="remark" />
<result column="source_id" property="sourceId" />
<result column="table_id" property="tableId" />
<result column="column_name" property="columnName" />
<result column="column_comment" property="columnComment" />
<result column="column_key" property="columnKey" />
<result column="column_nullable" property="columnNullable" />
<result column="column_position" property="columnPosition" />
<result column="data_type" property="dataType" />
<result column="data_length" property="dataLength" />
<result column="data_precision" property="dataPrecision" />
<result column="data_scale" property="dataScale" />
<result column="data_default" property="dataDefault" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
status,
create_by,
create_time,
update_by,
update_time,
remark,
source_id, table_id, column_name, column_comment, column_key, column_nullable, column_position, data_type, data_length, data_precision, data_scale, data_default
</sql>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.datax.service.data.metadata.dao.DataMetadataTableDao">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.datax.service.data.metadata.api.entity.DataMetadataTableEntity">
<result column="id" property="id" />
<result column="status" property="status" />
<result column="create_by" property="createBy" />
<result column="create_time" property="createTime" />
<result column="update_by" property="updateBy" />
<result column="update_time" property="updateTime" />
<result column="remark" property="remark" />
<result column="source_id" property="sourceId" />
<result column="table_name" property="tableName" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id,
status,
create_by,
create_time,
update_by,
update_time,
remark,
source_id, table_name
</sql>
</mapper>
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,batch,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
# 开启过滤
filter=true
# 配置不打印的内容
exclude=select 1
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>datax-modules</artifactId>
<groupId>cn.datax</groupId>
<version>2.0.0</version>
</parent>
<packaging>pom</packaging>
<modelVersion>4.0.0</modelVersion>
<version>2.0.0</version>
<description>元数据</description>
<artifactId>data-metadata-service-parent</artifactId>
<modules>
<module>data-metadata-service</module>
<module>data-metadata-service-api</module>
</modules>
</project>
\ No newline at end of file
......@@ -20,5 +20,6 @@
<module>data-market-service-parent</module>
<module>quartz-service-parent</module>
<module>codegen-service-parent</module>
<module>data-metadata-service-parent</module>
</modules>
</project>
\ No newline at end of file
......@@ -17,7 +17,7 @@ public class AsyncTask {
@Autowired
private LogService logService;
@Async("dataxAsyncThreadPool")
@Async
public void doTask(LogDto logDto) {
logService.saveLog(logDto);
}
......
package cn.datax.service.system.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@EnableAsync
public class LogAsyncConfig {
@Configuration
public class AsyncConfig {
@Bean("dataxAsyncThreadPool")
public ThreadPoolTaskExecutor asyncThreadPoolTaskExecutor() {
@Bean("taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(100);
executor.setKeepAliveSeconds(30);
executor.setThreadNamePrefix("Datax-Async-Thread");
executor.setThreadNamePrefix("datax-async-service-");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment