Browse Source

生成二维码增加线程池

dev
liushaowen 5 years ago
parent
commit
531931c818
  1. 19
      epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/AccessTokenDTO.java
  2. 53
      epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/utils/ThirdUtils.java
  3. 20
      epmet-module/resi-group/resi-group-server/pom.xml
  4. 49
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/AsyncConfig.java
  5. 2
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/controller/ResiGroupCodeController.java
  6. 4
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupCodeService.java
  7. 134
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupCodeServiceImpl.java
  8. 2
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java
  9. 25
      epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/properties/ThreadProperties.java
  10. 10
      epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml

19
epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/dto/AccessTokenDTO.java

@ -0,0 +1,19 @@
package com.epmet.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @description:
* @author: liushaowen
* @date: 2020/11/17 10:07
*/
@Data
public class AccessTokenDTO implements Serializable {
private String resiToken;
private String workToken;
private String errMsg;
}

53
epmet-module/epmet-third/epmet-third-client/src/main/java/com/epmet/utils/ThirdUtils.java

@ -0,0 +1,53 @@
package com.epmet.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.epmet.commons.tools.enums.EnvEnum;
import com.epmet.commons.tools.utils.ConvertUtils;
import com.epmet.commons.tools.utils.HttpClientManager;
import com.epmet.commons.tools.utils.Result;
import com.epmet.dto.AccessTokenDTO;
import com.epmet.dto.result.CustomerTokensResultDTO;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* @description:
* @author: liushaowen
* @date: 2020/11/17 10:04
*/
public class ThirdUtils {
/**
* @Description 获取AccessToken公共方法
* @param customerId
* @return com.epmet.dto.AccessTokenDTO
* @Author liushaowen
* @Date 2020/11/17 10:09
*/
public static AccessTokenDTO getAccessToken(String customerId) {
EnvEnum envEnum = EnvEnum.getCurrentEnv();
AccessTokenDTO accessToken = new AccessTokenDTO();
String url = "https://epmet-cloud.elinkservice.cn/api/third/pacustomer/tokenlist";
JSONObject postData = new JSONObject();
postData.put("customerId", customerId);
String data = HttpClientManager.getInstance().sendPostByJSON(url, JSON.toJSONString(postData)).getData();
JSONObject toResult = JSON.parseObject(data);
Result mapToResult = ConvertUtils.mapToEntity(toResult, Result.class);
if (null != toResult.get("code")) {
mapToResult.setCode(((Integer) toResult.get("code")).intValue());
}
if (!mapToResult.success()) {
accessToken.setErrMsg( StringUtils.isBlank(mapToResult.getMsg()) ? mapToResult.getInternalMsg() : mapToResult.getMsg());
}
Object CustomerTokensResultDTO = mapToResult.getData();
JSONObject json = JSON.parseObject(CustomerTokensResultDTO.toString());
CustomerTokensResultDTO customerTokensResultDTO = ConvertUtils.mapToEntity(json, com.epmet.dto.result.CustomerTokensResultDTO.class);
accessToken.setResiToken(customerTokensResultDTO.getResiAuthorizerToken());
accessToken.setWorkToken(customerTokensResultDTO.getWorkAuthorizerToken());
return accessToken;
}
}

20
epmet-module/resi-group/resi-group-server/pom.xml

@ -160,6 +160,11 @@
<spring.flyway.enabled>false</spring.flyway.enabled>
<openapi.scan.server.url>https://epmet-dev.elinkservice.cn/api/epmetscan/api</openapi.scan.server.url>
<!--线程池配置-->
<thread.pool.core-pool-size>5</thread.pool.core-pool-size>
<thread.pool.max-pool-size>8</thread.pool.max-pool-size>
<thread.pool.queue-capacity>10</thread.pool.queue-capacity>
<thread.pool.keep-alive>30</thread.pool.keep-alive>
</properties>
</profile>
<profile>
@ -193,6 +198,11 @@
<spring.flyway.enabled>false</spring.flyway.enabled>
<openapi.scan.server.url>https://epmet-dev.elinkservice.cn/api/epmetscan/api</openapi.scan.server.url>
<!--线程池配置-->
<thread.pool.core-pool-size>5</thread.pool.core-pool-size>
<thread.pool.max-pool-size>8</thread.pool.max-pool-size>
<thread.pool.queue-capacity>10</thread.pool.queue-capacity>
<thread.pool.keep-alive>30</thread.pool.keep-alive>
</properties>
</profile>
<profile>
@ -225,6 +235,11 @@
<nacos.ip/>
<spring.flyway.enabled>true</spring.flyway.enabled>
<openapi.scan.server.url>https://epmet-dev.elinkservice.cn/api/epmetscan/api</openapi.scan.server.url>
<!--线程池配置-->
<thread.pool.core-pool-size>5</thread.pool.core-pool-size>
<thread.pool.max-pool-size>8</thread.pool.max-pool-size>
<thread.pool.queue-capacity>10</thread.pool.queue-capacity>
<thread.pool.keep-alive>30</thread.pool.keep-alive>
</properties>
</profile>
<profile>
@ -254,6 +269,11 @@
<nacos.ip/>
<spring.flyway.enabled>true</spring.flyway.enabled>
<openapi.scan.server.url>https://epmet-open.elinkservice.cn/api/epmetscan/api</openapi.scan.server.url>
<!--线程池配置-->
<thread.pool.core-pool-size>5</thread.pool.core-pool-size>
<thread.pool.max-pool-size>8</thread.pool.max-pool-size>
<thread.pool.queue-capacity>10</thread.pool.queue-capacity>
<thread.pool.keep-alive>30</thread.pool.keep-alive>
</properties>
</profile>
</profiles>

49
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/config/AsyncConfig.java

@ -0,0 +1,49 @@
package com.epmet.config;
import com.epmet.properties.ThreadProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 线程池配置类
*/
@Configuration
@EnableConfigurationProperties(ThreadProperties.class)
@EnableAsync
public class AsyncConfig {
@Autowired
private ThreadProperties threadProperties;
@Bean
public Executor executor() {
ThreadProperties.ThreadPoolProperties threadPoolProps = threadProperties.getThreadPool();
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(threadPoolProps.getCorePoolSize());
executor.setMaxPoolSize(threadPoolProps.getMaxPoolSize());
executor.setQueueCapacity(threadPoolProps.getQueueCapacity());
executor.setThreadNamePrefix("epmet-resi-group-");
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); //对拒绝task的处理策略
executor.setKeepAliveSeconds(threadPoolProps.getKeepAlive());
executor.initialize();
return executor;
}
@Bean
public ExecutorService executorService() {
ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) executor();
return executor.getThreadPoolExecutor();
}
}

2
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/controller/ResiGroupCodeController.java

@ -89,7 +89,7 @@ public class ResiGroupCodeController {
@RequestMapping("creategroupcode")
public Result<String> createGroupCode(@RequestBody CreateGroupCodeFormDTO dto){
ValidatorUtils.validateEntity(dto);
return new Result<String>().ok(resiGroupCodeService.createGroupCode(dto));
return new Result<String>().ok(resiGroupCodeService.createGroupCode(dto, true));
}
@RequestMapping("getgroupcode")

4
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/ResiGroupCodeService.java

@ -101,12 +101,12 @@ public interface ResiGroupCodeService extends BaseService<ResiGroupCodeEntity> {
/**
* @Description 创建群组二维码
* @param dto
* @param dto,syncFlag(是否同步执行,true同步,false异步)
* @return String
* @Author liushaowen
* @Date 2020/11/13 16:32
*/
String createGroupCode(CreateGroupCodeFormDTO dto);
String createGroupCode(CreateGroupCodeFormDTO dto, boolean syncFlag);
/**
* @Description 获取群组二维码

134
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupCodeServiceImpl.java

@ -25,6 +25,7 @@ import com.epmet.commons.mybatis.service.impl.BaseServiceImpl;
import com.epmet.commons.tools.constant.FieldConstant;
import com.epmet.commons.tools.constant.NumConstant;
import com.epmet.commons.tools.enums.EnvEnum;
import com.epmet.commons.tools.exception.ExceptionUtils;
import com.epmet.commons.tools.exception.RenException;
import com.epmet.commons.tools.page.PageData;
import com.epmet.commons.tools.utils.ConvertUtils;
@ -48,6 +49,7 @@ import com.epmet.resi.group.dto.group.form.CreateGroupCodeFormDTO;
import com.epmet.resi.group.dto.group.form.GetGroupCodeFormDTO;
import com.epmet.resi.group.dto.group.form.GroupCodeBasicInfoFormDTO;
import com.epmet.resi.group.dto.group.result.GroupCodeBasicInfoResultDTO;
import com.epmet.utils.ThirdUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -58,6 +60,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.io.UnsupportedEncodingException;
import java.util.*;
import java.util.concurrent.ExecutorService;
/**
* 小组二维码 小组唯一二维码海报码和小组码是同一个二维码长期有效的
@ -76,6 +79,9 @@ public class ResiGroupCodeServiceImpl extends BaseServiceImpl<ResiGroupCodeDao,
@Autowired
private OssFeignClient ossFeignClient;
@Autowired
private ExecutorService executorService;
@Override
public PageData<ResiGroupCodeDTO> page(Map<String, Object> params) {
IPage<ResiGroupCodeEntity> page = baseDao.selectPage(
@ -129,14 +135,68 @@ public class ResiGroupCodeServiceImpl extends BaseServiceImpl<ResiGroupCodeDao,
}
/**
* @param dto
* @return void
* @param dto, syncFlag(是否同步执行,true同步,false异步)
* @return String
* @Description 创建群组二维码
* @Author liushaowen
* @Date 2020/11/13 16:32
*/
@Override
public String createGroupCode(CreateGroupCodeFormDTO dto) {
public String createGroupCode(CreateGroupCodeFormDTO dto, boolean syncFlag) {
if (syncFlag){
return createCodeFunction(dto);
}else {
executorService.execute(()->{
try {
long startTs = System.currentTimeMillis();
createCodeFunction(dto);
long endTs = System.currentTimeMillis();
logger.info("异步创建群二维码成功,执行时长:{}", endTs - startTs);
} catch (Exception e) {
logger.error("异步创建群二维码失败,错误信息:{}", ExceptionUtils.getErrorStackTrace(e));
}
});
return "";
}
}
/**
* @param dto
* @return com.epmet.commons.tools.utils.Result<java.lang.String>
* @Description 获取群组二维码
* @Author liushaowen
* @Date 2020/11/16 9:37
*/
@Override
public Result<String> getGroupCode(GetGroupCodeFormDTO dto) {
ResiGroupCodeEntity codeByGroupId = getCode(dto.getGroupId(), dto.getType());
if (codeByGroupId != null) {
//数据库有数据
return new Result<String>().ok(codeByGroupId.getUrl());
} else {
//从微信获取二维码并存储
CreateGroupCodeFormDTO createDto = new CreateGroupCodeFormDTO();
BeanUtils.copyProperties(dto, createDto);
String url = createGroupCode(createDto, false);
if (StringUtils.isBlank(url)){
throw new RenException("获取二维码失败");
}
return new Result<String>().ok(url);
}
}
private ResiGroupCodeEntity getCode(String groupId, String type) {
if (StringUtils.isBlank(groupId) || StringUtils.isBlank(type)) {
throw new RenException("获取二维码失败,groupId或type为空");
}
QueryWrapper<ResiGroupCodeEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("DEL_FLAG", "0");
queryWrapper.eq("GROUP_ID", groupId);
queryWrapper.eq("TYPE", type);
return baseDao.selectOne(queryWrapper);
}
private String createCodeFunction(CreateGroupCodeFormDTO dto){
String result = "";
ResiGroupCodeEntity codeByGroupId = getCode(dto.getGroupId(), dto.getType());
if (codeByGroupId != null) {
@ -146,7 +206,7 @@ public class ResiGroupCodeServiceImpl extends BaseServiceImpl<ResiGroupCodeDao,
//向微信获取二维码
// 获取AccessToken
String accessToken = getAccessToken(dto.getCustomerId());
String accessToken = ThirdUtils.getAccessToken(dto.getCustomerId()).getResiToken();
if (StringUtils.isBlank(accessToken)) {
logger.error("获取accessToken失败,customerId:{}", dto.getCustomerId());
throw new RenException("获取accessToken失败");
@ -192,70 +252,6 @@ public class ResiGroupCodeServiceImpl extends BaseServiceImpl<ResiGroupCodeDao,
return result;
}
/**
* @param dto
* @return com.epmet.commons.tools.utils.Result<java.lang.String>
* @Description 获取群组二维码
* @Author liushaowen
* @Date 2020/11/16 9:37
*/
@Override
public Result<String> getGroupCode(GetGroupCodeFormDTO dto) {
ResiGroupCodeEntity codeByGroupId = getCode(dto.getGroupId(), dto.getType());
if (codeByGroupId != null) {
//数据库有数据
return new Result<String>().ok(codeByGroupId.getUrl());
} else {
//从微信获取二维码并存储
CreateGroupCodeFormDTO createDto = new CreateGroupCodeFormDTO();
BeanUtils.copyProperties(dto, createDto);
String url = createGroupCode(createDto);
if (StringUtils.isBlank(url)){
throw new RenException("获取二维码失败");
}
return new Result<String>().ok(url);
}
}
private ResiGroupCodeEntity getCode(String groupId, String type) {
if (StringUtils.isBlank(groupId) || StringUtils.isBlank(type)) {
throw new RenException("获取二维码失败,groupId或type为空");
}
QueryWrapper<ResiGroupCodeEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("DEL_FLAG", "0");
queryWrapper.eq("GROUP_ID", groupId);
queryWrapper.eq("TYPE", type);
return baseDao.selectOne(queryWrapper);
}
//获取AccessToken
private String getAccessToken(String customerId) {
EnvEnum envEnum = EnvEnum.getCurrentEnv();
String resiAccessToken = null;
if (EnvEnum.PROD.getCode().equals(envEnum.getCode())) {
//居民端
StringBuilder resiKey = new StringBuilder(customerId).append(":resi");
Map<String, Object> authorizerRefreshToken = new HashMap<>();
authorizerRefreshToken = resiGroupCodeRedis.getAuthorizerRefreshToken(resiKey.toString());
resiAccessToken = (String) authorizerRefreshToken.get("authorizerAccessToken");
} else {
String url = "https://epmet-cloud.elinkservice.cn/api/third/pacustomer/tokenlist";
JSONObject postData = new JSONObject();
postData.put("customerId", customerId);
String data = HttpClientManager.getInstance().sendPostByJSON(url, JSON.toJSONString(postData)).getData();
JSONObject toResult = JSON.parseObject(data);
Result mapToResult = ConvertUtils.mapToEntity(toResult, Result.class);
if (null != toResult.get("code")) {
mapToResult.setCode(((Integer) toResult.get("code")).intValue());
}
Object CustomerTokensResultDTO = mapToResult.getData();
JSONObject json = JSON.parseObject(CustomerTokensResultDTO.toString());
CustomerTokensResultDTO customerTokensResultDTO = ConvertUtils.mapToEntity(json, com.epmet.dto.result.CustomerTokensResultDTO.class);
resiAccessToken = customerTokensResultDTO.getResiAuthorizerToken();
}
return resiAccessToken;
}
/**
* @param formDTO
* @Description 获取生成海报(小组码)信息
@ -272,7 +268,7 @@ public class ResiGroupCodeServiceImpl extends BaseServiceImpl<ResiGroupCodeDao,
if (null == resultDTO.getGroupCodeUrl() || "".equals(resultDTO.getGroupCodeUrl())) {
CreateGroupCodeFormDTO dto = ConvertUtils.sourceToTarget(formDTO, CreateGroupCodeFormDTO.class);
dto.setType(GroupCodeConstant.CODE_TYPE_INVITE);
String url = createGroupCode(dto);
String url = createGroupCode(dto, true);
if (StringUtils.isBlank(url)) {
logger.error(String.format("生成小组二维码失败,小组Id:%s", formDTO.getGroupId()));
throw new RenException("获取小组码基本信息失败");

2
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/modules/group/service/impl/ResiGroupServiceImpl.java

@ -528,7 +528,7 @@ public class ResiGroupServiceImpl extends BaseServiceImpl<ResiGroupDao, ResiGrou
dto.setGridId(resiGroupDTO.getGridId());
dto.setGroupId(resiGroupDTO.getId());
dto.setType(GroupCodeConstant.CODE_TYPE_INVITE);
resiGroupCodeService.createGroupCode(dto);
resiGroupCodeService.createGroupCode(dto ,false);
} catch (Exception e) {
logger.error(String.format("小组审核通过,生成小组二维码失败", e.getMessage()));
}

25
epmet-module/resi-group/resi-group-server/src/main/java/com/epmet/properties/ThreadProperties.java

@ -0,0 +1,25 @@
package com.epmet.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* 线程池属性类
*/
@ConfigurationProperties(prefix = "thread")
@Data
public class ThreadProperties {
private ThreadPoolProperties threadPool;
@Data
public static class ThreadPoolProperties {
private int corePoolSize;
private int maxPoolSize;
private int queueCapacity;
private int keepAlive;
public ThreadPoolProperties() {
}
}
}

10
epmet-module/resi-group/resi-group-server/src/main/resources/bootstrap.yml

@ -125,4 +125,12 @@ openapi:
url: @openapi.scan.server.url@
method:
imgSyncScan: /imgSyncScan
textSyncScan: /textSyncScan
textSyncScan: /textSyncScan
thread:
# 线程池配置
threadPool:
corePoolSize: @thread.pool.core-pool-size@
maxPoolSize: @thread.pool.max-pool-size@
queueCapacity: @thread.pool.queue-capacity@
keepAlive: @thread.pool.keep-alive@

Loading…
Cancel
Save