From b853929e2fec53a9246aa1825af94890c0d06fdb Mon Sep 17 00:00:00 2001 From: iizmg Date: Sun, 26 Apr 2020 14:14:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- udf-api/pom.xml | 7 ++ udf-api/udf-api-common/pom.xml | 21 ++-- .../udf/api/common/CommonConfiguration.java | 12 ++ .../itkk/udf/api/common/CommonConstant.java | 61 ++++++++++ .../itkk/udf/api/common/CommonProperties.java | 13 ++ .../udf/api/common/component/DbLogImpl.java | 72 +++++++++++ .../api/common/component/DbQueueLockImpl.java | 27 +++++ .../itkk/udf/api/common/dto/SendMailDto.java | 25 ++++ .../udf/api/common/entity/DataHisEntity.java | 54 +++++++++ .../api/common/entity/ParameterEntity.java | 68 +++++++++++ .../api/common/entity/TraceInfoEntity.java | 44 +++++++ .../common/repository/IDataHisRepository.java | 9 ++ .../repository/IParameterRepository.java | 10 ++ .../repository/ITraceInfoRepository.java | 16 +++ .../api/common/service/DataHisService.java | 42 +++++++ .../api/common/service/ParameterService.java | 113 ++++++++++++++++++ .../api/common/service/TraceInfoService.java | 64 ++++++++++ .../common/web/ParameterBaseController.java | 69 +++++++++++ .../resources/mapper/IDataHisRepository.xml | 5 + .../resources/mapper/IParameterRepository.xml | 5 + .../resources/mapper/ITraceInfoRepository.xml | 9 ++ udf-api/udf-api-general/pom.xml | 24 ++++ .../udf/api/general/GeneralConfiguration.java | 33 +++++ .../general/dbqueue/SendMailQueueHandle.java | 33 +++++ .../api/general/job/ClearTraceInfoJob.java | 57 +++++++++ .../api/general/web/ParameterController.java | 12 ++ .../src/main/resources/README.md | 0 udf-api/udf-api-server/pom.xml | 4 +- .../main/resources/application-dev.properties | 2 +- .../resources/application-prod.properties | 2 +- 30 files changed, 899 insertions(+), 14 deletions(-) create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/component/DbLogImpl.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/component/DbQueueLockImpl.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/dto/SendMailDto.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/DataHisEntity.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/ParameterEntity.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/TraceInfoEntity.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/IDataHisRepository.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/IParameterRepository.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/ITraceInfoRepository.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/DataHisService.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/ParameterService.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/TraceInfoService.java create mode 100644 udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/web/ParameterBaseController.java create mode 100644 udf-api/udf-api-common/src/main/resources/mapper/IDataHisRepository.xml create mode 100644 udf-api/udf-api-common/src/main/resources/mapper/IParameterRepository.xml create mode 100644 udf-api/udf-api-common/src/main/resources/mapper/ITraceInfoRepository.xml create mode 100644 udf-api/udf-api-general/pom.xml create mode 100644 udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/GeneralConfiguration.java create mode 100644 udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/dbqueue/SendMailQueueHandle.java create mode 100644 udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/job/ClearTraceInfoJob.java create mode 100644 udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/web/ParameterController.java rename udf-api/{udf-api-common => udf-api-general}/src/main/resources/README.md (100%) diff --git a/udf-api/pom.xml b/udf-api/pom.xml index b72adb6..3f0b106 100644 --- a/udf-api/pom.xml +++ b/udf-api/pom.xml @@ -26,6 +26,7 @@ udf-api-server udf-api-common + udf-api-general @@ -38,6 +39,12 @@ pom import + + + org.itkk.udf + udf-api-general + ${udf-api.version} + org.itkk.udf diff --git a/udf-api/udf-api-common/pom.xml b/udf-api/udf-api-common/pom.xml index eed3f78..5f17fe8 100644 --- a/udf-api/udf-api-common/pom.xml +++ b/udf-api/udf-api-common/pom.xml @@ -30,6 +30,16 @@ org.itkk.udf udf-starter-datasource-dynamic + + + org.itkk.udf + udf-starter-cache-db + + + + org.itkk.udf + udf-starter-queue-db + @@ -42,16 +52,7 @@ - - - - - - - - - - + diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonConfiguration.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonConfiguration.java index 9108b7a..4c7c880 100644 --- a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonConfiguration.java +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonConfiguration.java @@ -1,5 +1,7 @@ package org.itkk.udf.api.common; +import org.itkk.udf.starter.cache.db.DbCacheServiceRegistration; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -9,4 +11,14 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CommonConfiguration implements WebMvcConfigurer { + /** + * dbCacheServiceRegistration + * + * @return DbCacheServiceRegistration + */ + @Bean(destroyMethod = "shutdown") + public DbCacheServiceRegistration dbCacheServiceRegistration() { + return new DbCacheServiceRegistration(); + } + } diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonConstant.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonConstant.java index 8b23afc..f17408a 100644 --- a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonConstant.java +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonConstant.java @@ -4,6 +4,67 @@ package org.itkk.udf.api.common; * 常量类 */ public class CommonConstant { + + /** + * web根路径 + */ + public static final String URL_ROOT_WEB = "/api/udf/web"; + + /** + * 需认证的web根路径 + */ + public static final String URL_ROOT_WEB_PRIVATE = URL_ROOT_WEB + "/private"; + + /** + * 无需认证的web根路径 + */ + public static final String URL_ROOT_WEB_PUBLIC = URL_ROOT_WEB + "/public"; + + /** + * 默认时间格式 + */ + public static final String DEF_DATA_FMT = "yyyy-MM-dd HH:mm:ss"; + + /** + * 默认锁失败信息 + */ + public static final String DEF_LOCK_FAIL_MSG = "该数据正在被处理中,请稍后再试"; + + /** + * token参数名 + */ + public static final String PARAMETER_NAME_TOKEN = "token"; + + /** + * token信息参数名 + */ + public static final String PARAMETER_NAME_TOKEN_INFO = "tokenInfo"; + + /** + * token超时时间 + */ + public static final long TOKEN_CACHE_TTL = 30 * 60 * 1000L; + + /** + * 刷新token时间 + */ + public static final long REFRESH_TOKEN_CACHE_TTL = 15 * 60 * 1000L; + + /** + * 锁超时时间 + */ + public static final Long LOCK_EXPAIR = 5 * 60 * 1000L; + + /** + * 发送邮件队列名 + */ + public static final String SEND_EMAIL_QUEUE = "SEND_EMAIL_QUEUE"; + + /** + * 发送邮件队列处理器 + */ + public static final String SEND_EMAIL_QUEUE_HANDLE = "SEND_EMAIL_QUEUE_HANDLE"; + /** * 私有化构造函数 */ diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonProperties.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonProperties.java index 8317752..7c91078 100644 --- a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonProperties.java +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/CommonProperties.java @@ -5,6 +5,8 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotNull; + /** * 属性类 */ @@ -17,4 +19,15 @@ public class CommonProperties { * 配置文件前缀 */ protected static final String UDF_API_PROPERTIES = "org.itkk.udf.api.common.properties"; + + /** + * 追踪日志保留天数 + */ + @NotNull(message = UDF_API_PROPERTIES + ".traceLogKeepDays不能为空") + private Integer traceLogKeepDays = 5; + + /** + * 发送邮件队列并发数 + */ + private Integer sendEmailQueueMaxConcurrency = 1; } diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/component/DbLogImpl.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/component/DbLogImpl.java new file mode 100644 index 0000000..8a4664b --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/component/DbLogImpl.java @@ -0,0 +1,72 @@ +package org.itkk.udf.api.common.component; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.itkk.udf.api.common.service.DataHisService; +import org.itkk.udf.api.common.service.TraceInfoService; +import org.itkk.udf.starter.core.exception.SystemRuntimeException; +import org.itkk.udf.starter.core.exception.handle.IExceptionAlert; +import org.itkk.udf.starter.core.trace.IDataHis; +import org.itkk.udf.starter.core.trace.ITraceAlert; +import org.itkk.udf.starter.core.trace.TraceDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class DbLogImpl implements ITraceAlert, IExceptionAlert, IDataHis { + + /** + * traceInfoService + */ + @Autowired + private TraceInfoService traceInfoService; + + /** + * dataHisService + */ + @Autowired + private DataHisService dataHisService; + + /** + * internalObjectMapper + */ + @Autowired + @Qualifier("internalObjectMapper") + private ObjectMapper internalObjectMapper; + + @Override + public void save(String traceId, String name, String pk, Object content, String userId) { + try { + dataHisService.save(traceId, name, pk, internalObjectMapper.writeValueAsString(content), userId); + } catch (JsonProcessingException ex) { + throw new SystemRuntimeException(ex); + } + } + + @Override + @Async + public void alert(String traceId, Exception e) { + try { + final String type = "IExceptionAlert"; + traceInfoService.save(traceId, type, internalObjectMapper.writeValueAsString(ExceptionUtils.getStackTrace(e))); + } catch (JsonProcessingException ex) { + log.warn(traceId + " (IExceptionAlert)记录trace日志失败,错误信息为 : " + ex.getMessage()); + } + } + + @Override + @Async + public void alert(TraceDto traceDto) { + try { + final String type = "ITraceAlert"; + traceInfoService.save(traceDto.getTraceId(), type, internalObjectMapper.writeValueAsString(traceDto)); + } catch (JsonProcessingException e) { + log.warn(traceDto.getTraceId() + " (ITraceAlert)记录trace日志失败,错误信息为 : " + e.getMessage()); + } + } +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/component/DbQueueLockImpl.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/component/DbQueueLockImpl.java new file mode 100644 index 0000000..d731798 --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/component/DbQueueLockImpl.java @@ -0,0 +1,27 @@ +package org.itkk.udf.api.common.component; + +import org.itkk.udf.starter.cache.db.service.DbCacheService; +import org.itkk.udf.starter.queue.db.IDbQueueLock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class DbQueueLockImpl implements IDbQueueLock { + + /** + * dbCacheService + */ + @Autowired + private DbCacheService dbCacheService; + + @Override + public boolean lock(String key) { + final long expire = 30 * 60 * 1000L; + return dbCacheService.setNx(key, key, expire); + } + + @Override + public void unlock(String key) { + dbCacheService.delete(key); + } +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/dto/SendMailDto.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/dto/SendMailDto.java new file mode 100644 index 0000000..d4ad3dc --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/dto/SendMailDto.java @@ -0,0 +1,25 @@ +package org.itkk.udf.api.common.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.File; +import java.io.Serializable; +import java.util.Map; +import java.util.Set; + +@Data +@Accessors(chain = true) +@NoArgsConstructor +@ToString +@EqualsAndHashCode(callSuper = false) +public class SendMailDto implements Serializable { + private static final long serialVersionUID = 6443090530533741230L; //ID + private String emailSubject; //标题 + private String emailContent; //主题 + private Set addres; //地址列表 + private Map fileMap; //附件列表 +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/DataHisEntity.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/DataHisEntity.java new file mode 100644 index 0000000..e96535d --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/DataHisEntity.java @@ -0,0 +1,54 @@ +package org.itkk.udf.api.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.util.Date; + +@Data +@Accessors(chain = true) +@ToString +@EqualsAndHashCode(callSuper = false) +@TableName("TF_DATA_HIS") +public class DataHisEntity { + /** + * 主键 + */ + @TableId("ID") + private String id; + /** + * 追踪ID + */ + @TableField("TRACE_ID") + private String traceId; + /** + * 表名 + */ + @TableField("TABLE_NAME") + private String TABLE_NAME; + /** + * 表主键 + */ + @TableField("TABLE_PK") + private String TABLE_PK; + /** + * 表内容 + */ + @TableField("CONTENT") + private String content; + /** + * 创建时间 + */ + @TableField("CREATE_DATE") + private Date createDate; + /** + * 创建人 + */ + @TableField("CREATE_BY") + private String createBy; +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/ParameterEntity.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/ParameterEntity.java new file mode 100644 index 0000000..8addd6f --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/ParameterEntity.java @@ -0,0 +1,68 @@ +package org.itkk.udf.api.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.util.Date; + +@Data +@Accessors(chain = true) +@ToString +@EqualsAndHashCode(callSuper = false) +@TableName("TM_PARAMETER") +public class ParameterEntity { + + /** + * 代码 + */ + @TableId("CODE") + private String code; + + /** + * 类别 + */ + @TableField("TYPE") + private String type; + + /** + * 名称 + */ + @TableField("NAME") + private String name; + + /** + * 内容 + */ + @TableField("CONTENT") + private String content; + + /** + * 创建人 + */ + @TableField("CREATE_BY") + private String createBy; + + /** + * 创建时间 + */ + @TableField("CREATE_DATE") + private Date createDate; + + /** + * 更新人 + */ + @TableField("UPDATE_BY") + private String updateBy; + + /** + * 更新时间 + */ + @TableField("UPDATE_DATE") + private Date updateDate; + +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/TraceInfoEntity.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/TraceInfoEntity.java new file mode 100644 index 0000000..a15d532 --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/entity/TraceInfoEntity.java @@ -0,0 +1,44 @@ +package org.itkk.udf.api.common.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.util.Date; + +@Data +@Accessors(chain = true) +@ToString +@EqualsAndHashCode(callSuper = false) +@TableName("TF_TRACE_INFO") +public class TraceInfoEntity { + /** + * 主键 + */ + @TableId("ID") + private String ID; + /** + * 追踪ID + */ + @TableField("TRACE_ID") + private String traceId; + /** + * 类型 + */ + @TableField("TYPE") + private String type; + /** + * 追踪消息体 + */ + @TableField("CONTENT") + private String content; + /** + * 创建时间 + */ + @TableField("CREATE_DATE") + private Date createDate; +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/IDataHisRepository.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/IDataHisRepository.java new file mode 100644 index 0000000..d08202d --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/IDataHisRepository.java @@ -0,0 +1,9 @@ +package org.itkk.udf.api.common.repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.itkk.udf.api.common.entity.DataHisEntity; + +@Mapper +public interface IDataHisRepository extends BaseMapper { +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/IParameterRepository.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/IParameterRepository.java new file mode 100644 index 0000000..2af8871 --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/IParameterRepository.java @@ -0,0 +1,10 @@ +package org.itkk.udf.api.common.repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.itkk.udf.api.common.entity.ParameterEntity; + +@Mapper +public interface IParameterRepository extends BaseMapper { + +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/ITraceInfoRepository.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/ITraceInfoRepository.java new file mode 100644 index 0000000..2f6e400 --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/repository/ITraceInfoRepository.java @@ -0,0 +1,16 @@ +package org.itkk.udf.api.common.repository; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.itkk.udf.api.common.entity.TraceInfoEntity; + +@Mapper +public interface ITraceInfoRepository extends BaseMapper { + /** + * 清理追踪日志 + * + * @param traceLogKeepDays traceLogKeepDays + */ + void clearTraceInfo(@Param("traceLogKeepDays") Integer traceLogKeepDays); +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/DataHisService.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/DataHisService.java new file mode 100644 index 0000000..8c02a50 --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/DataHisService.java @@ -0,0 +1,42 @@ +package org.itkk.udf.api.common.service; + +import lombok.extern.slf4j.Slf4j; +import org.itkk.udf.api.common.entity.DataHisEntity; +import org.itkk.udf.api.common.repository.IDataHisRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.UUID; + +@Service +@Slf4j +public class DataHisService { + + /** + * iDataHisRepository + */ + @Autowired + private IDataHisRepository iDataHisRepository; + + /** + * 保存 + * + * @param traceId traceId + * @param name name + * @param pk pk + * @param content content + * @param userId userId + */ + public void save(String traceId, String name, String pk, String content, String userId) { + DataHisEntity entity = new DataHisEntity(); + entity.setId(UUID.randomUUID().toString()); + entity.setTraceId(traceId); + entity.setTABLE_NAME(name); + entity.setTABLE_PK(pk); + entity.setContent(content); + entity.setCreateDate(new Date()); + entity.setCreateBy(userId); + iDataHisRepository.insert(entity); + } +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/ParameterService.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/ParameterService.java new file mode 100644 index 0000000..8e1baf2 --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/ParameterService.java @@ -0,0 +1,113 @@ +package org.itkk.udf.api.common.service; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.itkk.udf.api.common.entity.ParameterEntity; +import org.itkk.udf.api.common.repository.IParameterRepository; +import org.itkk.udf.starter.core.exception.ParameterValidException; +import org.itkk.udf.starter.core.exception.SystemRuntimeException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +public class ParameterService { + + /** + * iParameterRepository + */ + @Autowired + private IParameterRepository iParameterRepository; + + /** + * internalObjectMapper + */ + @Autowired + @Qualifier("internalObjectMapper") + private ObjectMapper internalObjectMapper; + + /** + * 批量返回String类型的内容 + * + * @param codes codes + * @return + */ + public Map getStringBatch(List codes) { + //定义返回值 + final Map rv = new HashMap<>(); + //判空 + if (CollectionUtils.isNotEmpty(codes)) { + //去重 + codes = codes.stream().distinct().collect(Collectors.toList()); + //遍历 + codes.forEach(code -> { + try { + rv.put(code, this.getString(code)); + } catch (Exception e) { + rv.put(code, e.getMessage()); + } + }); + } + //返回 + return rv; + } + + /** + * 返回String类型的内容 + * + * @param code code + * @return String + */ + public String getString(String code) { + return this.getContent(code); + } + + /** + * 返回json类型的内容 + * + * @param code code + * @param + * @return T + * @throws IOException IOException + */ + public T getJson(String code, TypeReference typeReference) { + try { + //获得内容 + String content = this.getContent(code); + //判空 + if (StringUtils.isBlank(code)) { + return null; + } + //转换 & 返回 + return internalObjectMapper.readValue(content, typeReference); + } catch (Exception e) { + throw new SystemRuntimeException(e); + } + } + + /** + * 获得内容 + * + * @param code code + * @return String + */ + private String getContent(String code) { + //获得数据 + ParameterEntity parameterEntity = iParameterRepository.selectById(code); + //判空 + if (parameterEntity == null) { + throw new ParameterValidException("代码为" + code + "的变量不存在"); + } + //返回 + return parameterEntity.getContent(); + } + +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/TraceInfoService.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/TraceInfoService.java new file mode 100644 index 0000000..bce7d46 --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/service/TraceInfoService.java @@ -0,0 +1,64 @@ +package org.itkk.udf.api.common.service; + + +import lombok.extern.slf4j.Slf4j; +import org.itkk.udf.api.common.CommonProperties; +import org.itkk.udf.api.common.entity.TraceInfoEntity; +import org.itkk.udf.api.common.repository.ITraceInfoRepository; +import org.itkk.udf.starter.cache.db.service.DbCacheService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.UUID; + +@Service +@Slf4j +public class TraceInfoService { + /** + * iTraceInfoRepository + */ + @Autowired + private ITraceInfoRepository iTraceInfoRepository; + + /** + * dbCacheService + */ + @Autowired + private DbCacheService dbCacheService; + + /** + * commonProperties + */ + @Autowired + private CommonProperties commonProperties; + + /** + * 定时清理追踪日志 + */ + public void clearTraceInfo() { + iTraceInfoRepository.clearTraceInfo(commonProperties.getTraceLogKeepDays()); + } + + /** + * 保存log(异步) + * + * @param traceId traceId + * @param type type + * @param content content + */ + @Async + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public void save(String traceId, String type, String content) { + TraceInfoEntity traceInfoEntity = new TraceInfoEntity(); + traceInfoEntity.setID(UUID.randomUUID().toString()); + traceInfoEntity.setTraceId(traceId); + traceInfoEntity.setType(type); + traceInfoEntity.setContent(content); + traceInfoEntity.setCreateDate(new Date()); + iTraceInfoRepository.insert(traceInfoEntity); + } +} diff --git a/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/web/ParameterBaseController.java b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/web/ParameterBaseController.java new file mode 100644 index 0000000..421a2ae --- /dev/null +++ b/udf-api/udf-api-common/src/main/java/org/itkk/udf/api/common/web/ParameterBaseController.java @@ -0,0 +1,69 @@ +package org.itkk.udf.api.common.web; + +import com.fasterxml.jackson.core.type.TypeReference; +import org.itkk.udf.api.common.service.ParameterService; +import org.itkk.udf.starter.core.RestResponse; +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.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; +import java.util.Map; + +public abstract class ParameterBaseController { + + /** + * parameterService + */ + @Autowired + private ParameterService parameterService; + + /** + * 批量返回String类型的内容 + * + * @param codes codes + * @return RestResponse> + */ + @PostMapping("string/batch") + public RestResponse> getStringBatch(@RequestBody List codes) { + return new RestResponse<>(parameterService.getStringBatch(codes)); + } + + /** + * 返回String类型的内容 + * + * @param code code + * @return RestResponse + */ + @GetMapping("string/{code}") + public RestResponse getString(@PathVariable String code) { + return new RestResponse<>(parameterService.getString(code)); + } + + /** + * 返回json类型的map内容 + * + * @param code code + * @return RestResponse> + */ + @GetMapping("json/map/{code}") + public RestResponse> getJsonMap(@PathVariable String code) { + return new RestResponse<>(parameterService.getJson(code, new TypeReference>() { + })); + } + + /** + * 返回json类型的array内容 + * + * @param code code + * @return RestResponse>> + */ + @GetMapping("json/array/{code}") + public RestResponse>> getJsonArray(@PathVariable String code) { + return new RestResponse<>(parameterService.getJson(code, new TypeReference>>() { + })); + } + +} diff --git a/udf-api/udf-api-common/src/main/resources/mapper/IDataHisRepository.xml b/udf-api/udf-api-common/src/main/resources/mapper/IDataHisRepository.xml new file mode 100644 index 0000000..df9dc20 --- /dev/null +++ b/udf-api/udf-api-common/src/main/resources/mapper/IDataHisRepository.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/udf-api/udf-api-common/src/main/resources/mapper/IParameterRepository.xml b/udf-api/udf-api-common/src/main/resources/mapper/IParameterRepository.xml new file mode 100644 index 0000000..5d8dfb3 --- /dev/null +++ b/udf-api/udf-api-common/src/main/resources/mapper/IParameterRepository.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/udf-api/udf-api-common/src/main/resources/mapper/ITraceInfoRepository.xml b/udf-api/udf-api-common/src/main/resources/mapper/ITraceInfoRepository.xml new file mode 100644 index 0000000..e76d110 --- /dev/null +++ b/udf-api/udf-api-common/src/main/resources/mapper/ITraceInfoRepository.xml @@ -0,0 +1,9 @@ + + + + + DELETE + FROM TF_TRACE_INFO A + WHERE A.CREATE_DATE (SYSDATE - #{traceLogKeepDays}) + + \ No newline at end of file diff --git a/udf-api/udf-api-general/pom.xml b/udf-api/udf-api-general/pom.xml new file mode 100644 index 0000000..fb022cc --- /dev/null +++ b/udf-api/udf-api-general/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + udf-api-general + udf-api-general + jar + https://www.itkk.org/ + + + org.itkk.udf + udf-api + 1.0 + + + + + + org.itkk.udf + udf-api-common + + + diff --git a/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/GeneralConfiguration.java b/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/GeneralConfiguration.java new file mode 100644 index 0000000..98ffb73 --- /dev/null +++ b/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/GeneralConfiguration.java @@ -0,0 +1,33 @@ +package org.itkk.udf.api.general; + + +import org.itkk.udf.api.common.CommonConstant; +import org.itkk.udf.api.common.CommonProperties; +import org.itkk.udf.starter.queue.db.DbQueue; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 配置类 + */ +@Configuration +public class GeneralConfiguration { + + /** + * commonProperties + */ + @Autowired + private CommonProperties commonProperties; + + /** + * 发送邮件队列 + * + * @return DbQueue + */ + @Bean(name = CommonConstant.SEND_EMAIL_QUEUE, destroyMethod = "shutdown") + public DbQueue sendEmailQueue() { + return new DbQueue(CommonConstant.SEND_EMAIL_QUEUE, commonProperties.getSendEmailQueueMaxConcurrency()); + } + +} diff --git a/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/dbqueue/SendMailQueueHandle.java b/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/dbqueue/SendMailQueueHandle.java new file mode 100644 index 0000000..1024ab4 --- /dev/null +++ b/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/dbqueue/SendMailQueueHandle.java @@ -0,0 +1,33 @@ +package org.itkk.udf.api.general.dbqueue; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.itkk.udf.api.common.CommonConstant; +import org.itkk.udf.starter.core.exception.handle.IExceptionAlert; +import org.itkk.udf.starter.queue.db.IDbQueueHandle; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +@Component(CommonConstant.SEND_EMAIL_QUEUE_HANDLE) +@Slf4j +public class SendMailQueueHandle implements IDbQueueHandle { + + /** + * internalObjectMapper + */ + @Autowired + @Qualifier("internalObjectMapper") + private ObjectMapper internalObjectMapper; + + /** + * iExceptionAlert + */ + @Autowired(required = false) + private IExceptionAlert iExceptionAlert; + + @Override + public void handle(String id, String body) { + log.warn("邮件发送服务暂未实现"); + } +} diff --git a/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/job/ClearTraceInfoJob.java b/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/job/ClearTraceInfoJob.java new file mode 100644 index 0000000..a2fce08 --- /dev/null +++ b/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/job/ClearTraceInfoJob.java @@ -0,0 +1,57 @@ +package org.itkk.udf.api.general.job; + +import lombok.extern.slf4j.Slf4j; +import org.itkk.udf.api.common.service.TraceInfoService; +import org.itkk.udf.starter.cache.db.service.DbCacheService; +import org.itkk.udf.starter.core.CoreUtil; +import org.itkk.udf.starter.core.job.IJobHandle; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class ClearTraceInfoJob implements IJobHandle { + + /** + * dbCacheService + */ + @Autowired + private DbCacheService dbCacheService; + + /** + * traceInfoService + */ + @Autowired + private TraceInfoService traceInfoService; + + @Override + @Scheduled(cron = "0 0 1 * * ?") + public void execution() { + //开始时间 + long startTime = System.currentTimeMillis(); + //定义key + final String key = "job:clearTraceInfo"; + //定义过期时间(10分钟) + final long expire = 10 * 60 * 1000L; + //定义job的traceId + final String traceId = CoreUtil.getTraceId(); + //悲观锁-锁定任务 + if (dbCacheService.setNx(key, Long.valueOf(System.currentTimeMillis()).toString(), expire)) { + //日志输出 + log.info("{} 清理追踪日志(lock success)", traceId); + //开始处理 + try { + traceInfoService.clearTraceInfo(); + } finally { + //删除key + dbCacheService.delete(key); + //日志输出 + log.info("{} 清理追踪日志(unlock success)(耗时:{}毫秒)", traceId, (System.currentTimeMillis() - startTime)); + } + } else { + //日志输出 + log.info("{} 清理追踪日志(lock fail)", traceId); + } + } +} diff --git a/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/web/ParameterController.java b/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/web/ParameterController.java new file mode 100644 index 0000000..be18465 --- /dev/null +++ b/udf-api/udf-api-general/src/main/java/org/itkk/udf/api/general/web/ParameterController.java @@ -0,0 +1,12 @@ +package org.itkk.udf.api.general.web; + +import org.itkk.udf.api.common.CommonConstant; +import org.itkk.udf.api.common.web.ParameterBaseController; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(value = CommonConstant.URL_ROOT_WEB_PRIVATE + "parameter/") +public class ParameterController extends ParameterBaseController { + +} diff --git a/udf-api/udf-api-common/src/main/resources/README.md b/udf-api/udf-api-general/src/main/resources/README.md similarity index 100% rename from udf-api/udf-api-common/src/main/resources/README.md rename to udf-api/udf-api-general/src/main/resources/README.md diff --git a/udf-api/udf-api-server/pom.xml b/udf-api/udf-api-server/pom.xml index 52722fe..ecee39b 100644 --- a/udf-api/udf-api-server/pom.xml +++ b/udf-api/udf-api-server/pom.xml @@ -20,10 +20,10 @@ - + org.itkk.udf - udf-api-common + udf-api-general diff --git a/udf-api/udf-api-server/src/main/resources/application-dev.properties b/udf-api/udf-api-server/src/main/resources/application-dev.properties index 019abf0..2b7aa81 100644 --- a/udf-api/udf-api-server/src/main/resources/application-dev.properties +++ b/udf-api/udf-api-server/src/main/resources/application-dev.properties @@ -19,7 +19,7 @@ org.itkk.udf.starter.datasource.dynamic.properties.map.udf.enable=true org.itkk.udf.starter.datasource.dynamic.properties.map.udf.url=jdbc:mysql://itkk.org:3306/dev_udf?useUnicode=true&useSSL=false&autoReconnect=true org.itkk.udf.starter.datasource.dynamic.properties.map.udf.username=dev_udf org.itkk.udf.starter.datasource.dynamic.properties.map.udf.password=123456 -org.itkk.udf.starter.datasource.dynamic.properties.map.udf.driverClassName=com.mysql.jdbc.Driver +org.itkk.udf.starter.datasource.dynamic.properties.map.udf.driverClassName=com.mysql.cj.jdbc.Driver org.itkk.udf.starter.datasource.dynamic.properties.map.udf.initialSize=1 org.itkk.udf.starter.datasource.dynamic.properties.map.udf.minIdle=1 org.itkk.udf.starter.datasource.dynamic.properties.map.udf.maxActive=2 diff --git a/udf-api/udf-api-server/src/main/resources/application-prod.properties b/udf-api/udf-api-server/src/main/resources/application-prod.properties index 834c078..5022e61 100644 --- a/udf-api/udf-api-server/src/main/resources/application-prod.properties +++ b/udf-api/udf-api-server/src/main/resources/application-prod.properties @@ -19,7 +19,7 @@ org.itkk.udf.starter.datasource.dynamic.properties.map.udf.enable=true org.itkk.udf.starter.datasource.dynamic.properties.map.udf.url=jdbc:mysql://itkk.org:3306/dev_prod?useUnicode=true&useSSL=false&autoReconnect=true org.itkk.udf.starter.datasource.dynamic.properties.map.udf.username=dev_prod org.itkk.udf.starter.datasource.dynamic.properties.map.udf.password=5ds2c6de54t1fd36e5f -org.itkk.udf.starter.datasource.dynamic.properties.map.udf.driverClassName=com.mysql.jdbc.Driver +org.itkk.udf.starter.datasource.dynamic.properties.map.udf.driverClassName=com.mysql.cj.jdbc.Driver org.itkk.udf.starter.datasource.dynamic.properties.map.udf.initialSize=1 org.itkk.udf.starter.datasource.dynamic.properties.map.udf.minIdle=1 org.itkk.udf.starter.datasource.dynamic.properties.map.udf.maxActive=2