[其他提交](master): 结构更新

更改项目工程框架设计;
完成视图层代码设计;
完成流程逻辑框架编写;
master
土豆兄弟 3 years ago
parent c3b1e9c222
commit 1f438655f5

@ -15,7 +15,7 @@
<modules> <modules>
<module>short-server-common</module> <module>short-server-common</module>
<module>short-server-service</module> <module>short-server-service</module>
<module>short-server-api</module> <module>short-server-pojo</module>
</modules> </modules>
<parent> <parent>
@ -31,31 +31,50 @@
<druid.version>1.1.22</druid.version> <druid.version>1.1.22</druid.version>
<swagger.version>1.5.21</swagger.version> <swagger.version>1.5.21</swagger.version>
<hutool.version>5.3.4</hutool.version> <hutool.version>5.3.4</hutool.version>
<fastjson.version>1.2.73</fastjson.version>
<lombok.version>1.18.16</lombok.version>
<common-lang3.version>3.8.1</common-lang3.version>
</properties> </properties>
<!-- 相关依赖管理 --> <!-- 相关依赖管理 -->
<dependencies> <dependencyManagement>
<dependencies>
<!-- swagger - API文档生成 -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger.version}</version>
</dependency>
<!-- hutool 工具包 -->
<!--工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${common-lang3.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- swagger - API文档生成 -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger.version}</version>
</dependency>
<!-- hutool 工具包 -->
<!--工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
</dependencies>
<build> <build>

@ -1,189 +0,0 @@
# Created by .ignore support plugin (hsz.mobi)
### project
log/
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### Maven template
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

@ -23,6 +23,18 @@
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -0,0 +1,7 @@
package com.by.constants;
/**
*
*/
public class SystemConstant {
}

@ -7,10 +7,9 @@
<groupId>com.by</groupId> <groupId>com.by</groupId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>short-server-api</artifactId> <artifactId>short-server-pojo</artifactId>
<properties> <properties>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
@ -18,29 +17,10 @@
</properties> </properties>
<dependencies> <dependencies>
<!-- 依赖通用模块 -->
<dependency> <dependency>
<groupId>com.by</groupId> <groupId>com.by</groupId>
<artifactId>short-server-common</artifactId> <artifactId>short-server-common</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<!--Spring boot Web容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- swagger - API文档生成 -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -0,0 +1,23 @@
package com.by.dto;
import lombok.Data;
import java.util.List;
import java.util.Set;
/**
* @author q
*/
@Data
public class ShortChainDTO {
/**
*
*/
private Set<String> shortChainOrigins;
/**
*
*/
private List<String> shortChainResult;
}

@ -24,6 +24,22 @@
<artifactId>short-server-common</artifactId> <artifactId>short-server-common</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency>
<groupId>com.by</groupId>
<artifactId>short-server-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- swagger - API文档生成 -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</dependency>
<!--Spring boot 核心--> <!--Spring boot 核心-->
<dependency> <dependency>

@ -0,0 +1,63 @@
package com.by.api;
import cn.hutool.core.collection.CollectionUtil;
import com.by.api.common.CommonResponse;
import com.by.api.convert.ShortChainVOToDTOConvert;
import com.by.api.vo.ShortChainRequestVO;
import com.by.api.vo.ShortChainResponseVO;
import com.by.dto.ShortChainDTO;
import com.by.service.ShortServerService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
/**
* @author q
*/
@Controller
@Slf4j
public class ShortServerOpenApiController {
// TODO: 2021/4/14 0014 添加接口限流
// TODO: 2021/4/14 0014 添加接口相关的验证 丰富VO层 加入 appid secret_key 及 时间戳验证
private final ShortServerService shortServerService;
public ShortServerOpenApiController(ShortServerService shortServerService) {
this.shortServerService = shortServerService;
}
@ApiOperation("批量生成短链接")
@PostMapping(value = "/trans")
@ResponseBody
public CommonResponse parseContentToShortChain(@Validated @RequestBody ShortChainRequestVO shortChainRequestVO) {
log.info("=== [ShortServerOpenApiController|parseContentToShortChain, one request is coming, request vo is {} ] ===", shortChainRequestVO.toString());
ShortChainDTO shortChainDTO = ShortChainVOToDTOConvert.convertShortChainRequestVOToDTO(shortChainRequestVO);
shortChainDTO = shortServerService.handleOriginUrlsToShortUrls(shortChainDTO);
List<String> shortChainResult = shortChainDTO.getShortChainResult();
ShortChainResponseVO shortChainResponseVO = new ShortChainResponseVO();
if (CollectionUtil.isNotEmpty(shortChainResult)){
shortChainResponseVO.setShortChainResult(shortChainResult);
}
return CommonResponse.createBySuccess(shortChainResponseVO);
}
@ApiOperation("短链接兑换长链接并进行")
@GetMapping(value = "/redeem")
public ModelAndView redeemShortChainClick(@RequestParam(value = "a")String param){
log.info("=== [ShortServerOpenApiController|redeemShortChainClick, one request is coming, request param is {} ] ===", param);
return shortServerService.handleOnceShortUrlToRedirectOriginUrlAndRecord(param);
}
}

@ -0,0 +1,132 @@
package com.by.api.common;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
*
* JsonInclude.Include.NON_EMPTY "" NULL json
*
* @param <T>
* @author q
*/
@JsonSerialize
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@NoArgsConstructor
public class CommonResponse<T> implements Serializable {
/**
* 0, 1,
*/
private int status;
/**
*
*/
private String msg;
/**
*
*/
private T data;
/*
*
*/
private CommonResponse(int status) {
this.status = status;
}
private CommonResponse(int status, T data) { // ps: 当调用T为String类型时候,会默认调用下面的ServerResponse(int status, String msg)类型的构造器
this.status = status;
this.data = data;
}
private CommonResponse(int status, String msg, T data) {
this.status = status;
this.msg = msg;
this.data = data;
}
private CommonResponse(int status, String msg) {
this.status = status;
this.msg = msg;
}
/*
* ,,
*/
/**
* @return
*/
public static <T> CommonResponse<T> createBySuccess() {
return new CommonResponse<T>(ResponseCode.SUCCESS.getCode(),ResponseCode.SUCCESS.getDesc());
}
/**
*
* @param msg
* @return
*/
public static <T> CommonResponse<T> createBySuccessMessage(String msg) {
return new CommonResponse<T>(ResponseCode.SUCCESS.getCode(), msg);
}
/**
*
* @param data
* @return
*/
public static <T> CommonResponse<T> createBySuccess(T data) {
return new CommonResponse<T>(ResponseCode.SUCCESS.getCode(), data);
}
/**
*
* @param msg
* @param data
* @return
*/
public static <T> CommonResponse<T> createBySuccess(String msg, T data) {
return new CommonResponse<T>(ResponseCode.SUCCESS.getCode(), msg, data);
}
/*
,,
*/
/**
*
* @return
*/
public static <T> CommonResponse<T> createByError(){
return new CommonResponse<T>(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getDesc());
}
/**
*
* @param errorMessage
* @return ()
*/
public static <T> CommonResponse<T> createByErrorMessage(String errorMessage){
return new CommonResponse<T>(ResponseCode.ERROR.getCode(),errorMessage);
}
/**
*
* @param errorCode
* @param errorMessage
* @return ()()
*/
public static <T> CommonResponse<T> createByErrorCodeMessage(int errorCode,String errorMessage){
return new CommonResponse<T>(errorCode,errorMessage);
}
}

@ -0,0 +1,48 @@
package com.by.api.common;
/**
* Description: Response ->
* @author q
*/
public enum ResponseCode {
/**
*
*/
SUCCESS(0,"SUCCESS"),
/**
*
*/
ERROR(1,"ERROR"),
/*
*
*/
ILLEGAL_ARGUMENT(1,"请求参数格式错误"),
EMPTY_ARGUMENT(1,"请求参数为空"),
/*
*
*/
NO_REASON_ERROR(1,"未知异常错误发生"),
SYSTEM_ERROR(1,"系统异常"),
DECRYPT_ERROR(1,"解密错误,请联系相关人员");
private final int code;
private final String desc;
ResponseCode(int code, String desc){
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
}

@ -0,0 +1,11 @@
package com.by.api.constants;
/**
* -
*/
public class RequestDetailConstant {
public static final String REQUEST_ADDR_EMPTY = "请求的地址为空";
public static final String REQUEST_PARAMS_EMPTY = "请求参数为空";
}

@ -0,0 +1,51 @@
package com.by.api.convert;
import cn.hutool.core.collection.CollectionUtil;
import com.by.api.vo.ShortChainRequestVO;
import com.by.dto.ShortChainDTO;
import org.apache.commons.lang3.StringUtils;
import java.util.HashSet;
import java.util.Set;
/**
* VO -> DTO
*/
public class ShortChainVOToDTOConvert {
/**
* vo -> dto
*/
public static ShortChainDTO convertShortChainRequestVOToDTO(ShortChainRequestVO shortChainRequestVO) {
Set<String> originsUrlSet = new HashSet<>(1000);
String baseUrlAddr = shortChainRequestVO.getBaseUrlAddr();
shortChainRequestVO.getVariableList().forEach(
each -> {
originsUrlSet.add(checkUrlAllowed(baseUrlAddr) + each);
}
);
if (CollectionUtil.isNotEmpty(originsUrlSet)){
ShortChainDTO shortChainDTO = new ShortChainDTO();
shortChainDTO.setShortChainOrigins(originsUrlSet);
return shortChainDTO;
}
return new ShortChainDTO();
}
private static String checkUrlAllowed(String baseUrlAddr) {
if (!StringUtils.endsWith(baseUrlAddr.trim(), "//")){
return baseUrlAddr.trim() + "//";
}
return baseUrlAddr.trim();
}
}

@ -0,0 +1,34 @@
package com.by.api.exception;
import com.by.api.common.CommonResponse;
import com.by.api.common.ResponseCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
*
*/
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandle {
/**
* Exception
*
* @param exception
*
* @return
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public CommonResponse customException(Exception exception) {
if (exception != null){
log.error(" =============== [ERROR , exception is {} , {}] ===============", exception.getMessage() ,exception);
return CommonResponse.createByErrorMessage(ResponseCode.SYSTEM_ERROR.getDesc());
}
return CommonResponse.createByErrorMessage(ResponseCode.NO_REASON_ERROR.getDesc());
}
}

@ -0,0 +1,30 @@
package com.by.api.vo;
import com.by.api.constants.RequestDetailConstant;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
*
*
* @author q
*/
@Data
public class ShortChainRequestVO {
/**
*
*/
@NotBlank(message = RequestDetailConstant.REQUEST_ADDR_EMPTY)
private String baseUrlAddr;
/**
*
*/
@NotEmpty(message = RequestDetailConstant.REQUEST_PARAMS_EMPTY)
private List<String> variableList;
}

@ -0,0 +1,19 @@
package com.by.api.vo;
import lombok.Data;
import java.util.List;
/**
*
*
* @author q
*/
@Data
public class ShortChainResponseVO {
/**
*
*/
private List<String> shortChainResult;
}

@ -0,0 +1,11 @@
package com.by.dao;
import com.by.entity.ShortUrl;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
@Repository
public interface ShortUrlRepository extends JpaRepository<ShortUrl, Long>, JpaSpecificationExecutor<ShortUrl> {
}

@ -0,0 +1,75 @@
package com.by.entity;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
@Entity
@Data
@Table(name = "t_short_url")
public class ShortUrl implements Serializable {
/**
* id
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
/**
*
*/
@Column(name = "gmt_create", nullable = false)
private Timestamp gmtCreate;
/**
*
*/
@Column(name = "gmt_modified", nullable = false)
private Timestamp gmtModified;
/**
* IP
*/
@Column(name = "operator_ip", nullable = false)
private String operatorIp;
/**
*
*/
@Column(name = "origin_url", nullable = false)
private String originUrl;
/**
*
*/
@Column(name = "short_url")
private String shortUrl;
/**
* 0- 1-
*/
@Column(name = "point_tag", nullable = false)
private Integer pointTag;
/**
* (day)
*/
@Column(name = "expiration_day", nullable = false)
private Integer expirationDay;
/**
* 0- 1-
*/
@Column(name = "valid_tag")
private Integer validTag;
public void copy(ShortUrl source) {
BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true));
}
}

@ -0,0 +1,25 @@
package com.by.service;
import com.by.dto.ShortChainDTO;
import org.springframework.web.servlet.ModelAndView;
/**
*
*/
public interface ShortServerService {
/**
*
*
* @param shortChainDTO
* @return
*/
ShortChainDTO handleOriginUrlsToShortUrls(ShortChainDTO shortChainDTO);
/**
*
*/
ModelAndView handleOnceShortUrlToRedirectOriginUrlAndRecord(String param);
}

@ -0,0 +1,41 @@
package com.by.service.impl;
import com.by.dto.ShortChainDTO;
import com.by.service.ShortServerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.ModelAndView;
/**
* Service
*
* @author q
*/
@Service
@Slf4j
public class ShortServerServiceImpl implements ShortServerService {
@Override
public ShortChainDTO handleOriginUrlsToShortUrls(ShortChainDTO shortChainDTO) {
// TODO: 2021/4/14 0014
// 1. 拼接请求调用短链生成器进行所有的短链请求
// 2. 生成的短链请求批量入库
// 3. 把短链请求 return 给调用方
return null;
}
@Override
public ModelAndView handleOnceShortUrlToRedirectOriginUrlAndRecord(String param) {
// 1. 查询库中的短链请求
// 2. 拿出真实请求进行跳转
// 3. 异步进行更新数据库中的点击记录及推送给之前的调用方(可以走消息)
return new ModelAndView("redirect:https://www.baidu.com/");
}
}

@ -0,0 +1,30 @@
package com.by.task;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
@Component
@Scope("prototype")
@Slf4j
public class ShortChainTask {
@Async(value = "abTaskExecutor")
public void doRunTask(){
Long satrtMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ task start running, task name is {} ] ======", "ABDownTask");
runTask();
Long endMilliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
log.info("====== [ task start end, task name is {},cost milliSecond is {} ] ======", "ABDownTask", (endMilliSecond-satrtMilliSecond));
}
private void runTask() {
}
}

@ -0,0 +1,54 @@
package com.by.task.conf;
import org.apache.tomcat.util.threads.ThreadPoolExecutor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;
/**
* 线,线
*/
@Configuration
@EnableAsync
public class ThreadPoolConfig {
/**
* 线
*/
@Value(value = "${short.chain.task.corePoolSize}")
private int corePoolSize = 4;
@Value(value = "${short.chain.task.maxPoolSize}")
private int maxPoolSize = 32;
@Value(value = "${short.chain.task.queueCapacity}")
private int queueCapacity = 100;
@Value(value = "${short.chain.task.ThreadNamePrefix}")
private String ThreadNamePrefix = "MyThreadPoolExecutor-";
/**
* AB 线
* @return
*/
@Bean
public Executor shortChainTaskExecutor() {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
corePoolSize,
maxPoolSize,
3,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(queueCapacity),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardOldestPolicy()
);
return threadPoolExecutor;
}
}

@ -4,7 +4,7 @@ spring:
druid: druid:
db-type: com.alibaba.druid.pool.DruidDataSource db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db-short-server?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true url: jdbc:mysql://localhost:3306/db_short_server?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true
username: root username: root
password: root password: root
# 初始连接数 # 初始连接数

@ -4,7 +4,7 @@ spring:
druid: druid:
db-type: com.alibaba.druid.pool.DruidDataSource db-type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/eladmin-plat2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true url: jdbc:mysql://localhost:3306/db_short_server?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false&rewriteBatchedStatements=true
username: root username: root
password: Yuyou@2020 password: Yuyou@2020
# 初始连接数 # 初始连接数

@ -26,3 +26,12 @@ spring:
# 配置日志 # 配置日志
logging: logging:
config: classpath:logback.xml config: classpath:logback.xml
# 线程池配置
short:
chain:
task:
corePoolSize: 4
maxPoolSize: 32
queueCapacity: 100
ThreadNamePrefix: 'shortChainTaskExecutor-'

@ -0,0 +1,28 @@
-- ----------------------------
-- TODO please create database first
-- ----------------------------
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_short_url
-- ----------------------------
DROP TABLE IF EXISTS `t_short_url`;
CREATE TABLE `t_short_url` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`gmt_create` datetime(0) NOT NULL COMMENT '创建时间',
`gmt_modified` datetime(0) NOT NULL COMMENT '修改时间',
`operator_ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '最后一次操作人的IP地址',
`origin_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '原始链接',
`short_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成短链',
`point_tag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '点击标识 0-未点击 1-点击',
`expiration_day` int(5) NOT NULL COMMENT '失效倒计时时间(day)',
`valid_tag` tinyint(1) NULL DEFAULT NULL COMMENT '有效标识 0-无效 1-有效',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
Loading…
Cancel
Save