Commit 6b349ca3 authored by suhuiguang's avatar suhuiguang

1.增加并发锁

parent 9ca5203f
...@@ -23,4 +23,9 @@ public interface BizCommonConstant { ...@@ -23,4 +23,9 @@ public interface BizCommonConstant {
*/ */
String UNIT_TYPE_LIST_REDIS_KEY = "UNIT_TYPE_LIST_REDIS_KEY"; String UNIT_TYPE_LIST_REDIS_KEY = "UNIT_TYPE_LIST_REDIS_KEY";
/**
* 所有字典缓存
*/
String TCM_ALL_DATA_DICT_REDIS_KEY = "TCM_ALL_DATA_DICT_REDIS_KEY";
} }
...@@ -73,4 +73,10 @@ public interface IRegUnitInfoService { ...@@ -73,4 +73,10 @@ public interface IRegUnitInfoService {
RegUnitInfoDto adminInfo(String unitCode); RegUnitInfoDto adminInfo(String unitCode);
String submit(Long pageId, String taskId, String planInstanceId, String topic, String tableName, Map<String, Object> objectMap) throws Exception; String submit(Long pageId, String taskId, String planInstanceId, String topic, String tableName, Map<String, Object> objectMap) throws Exception;
List<DataDictionary> getChildList(String type, String group);
void setAllDataDictionaryList();
List<DataDictionary> getDictionaryWithTreeFillId(String type);
} }
...@@ -138,6 +138,8 @@ public class AmosTcmApplication { ...@@ -138,6 +138,8 @@ public class AmosTcmApplication {
unitInfoService.getAllRegionTree(); unitInfoService.getAllRegionTree();
//5.企业类型放redis缓存(依赖1) //5.企业类型放redis缓存(依赖1)
regUnitInfoService.setAndGetUnitTypeList(); regUnitInfoService.setAndGetUnitTypeList();
//6.许可项目放redis缓存
regUnitInfoService.setAllDataDictionaryList();
} }
......
...@@ -2,11 +2,14 @@ package com.yeejoin.amos.boot.module.tcm.flc.biz.controller; ...@@ -2,11 +2,14 @@ package com.yeejoin.amos.boot.module.tcm.flc.biz.controller;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yeejoin.amos.boot.biz.common.bo.ReginParams; import com.yeejoin.amos.boot.biz.common.bo.ReginParams;
import com.yeejoin.amos.boot.biz.common.controller.BaseController; import com.yeejoin.amos.boot.biz.common.controller.BaseController;
import com.yeejoin.amos.boot.biz.common.entity.DataDictionary; import com.yeejoin.amos.boot.biz.common.entity.DataDictionary;
import com.yeejoin.amos.boot.biz.common.utils.Menu;
import com.yeejoin.amos.boot.biz.common.utils.RedisKey; import com.yeejoin.amos.boot.biz.common.utils.RedisKey;
import com.yeejoin.amos.boot.biz.common.utils.RedisUtils; import com.yeejoin.amos.boot.biz.common.utils.RedisUtils;
import com.yeejoin.amos.boot.biz.common.utils.TreeParser;
import com.yeejoin.amos.boot.module.tcm.flc.api.dto.RegUnitInfoDto; import com.yeejoin.amos.boot.module.tcm.flc.api.dto.RegUnitInfoDto;
import com.yeejoin.amos.boot.module.tcm.flc.api.service.IRegUnitInfoService; import com.yeejoin.amos.boot.module.tcm.flc.api.service.IRegUnitInfoService;
import com.yeejoin.amos.feign.privilege.Privilege; import com.yeejoin.amos.feign.privilege.Privilege;
...@@ -135,7 +138,6 @@ public class RegUnitInfoController extends BaseController { ...@@ -135,7 +138,6 @@ public class RegUnitInfoController extends BaseController {
} }
@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false) @TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@GetMapping(value = "/unit-type/list") @GetMapping(value = "/unit-type/list")
@ApiOperation(httpMethod = "GET", value = "单位类型列表", notes = "单位类型列表") @ApiOperation(httpMethod = "GET", value = "单位类型列表", notes = "单位类型列表")
public ResponseModel<List<DataDictionary>> unitTypeList() { public ResponseModel<List<DataDictionary>> unitTypeList() {
...@@ -144,7 +146,24 @@ public class RegUnitInfoController extends BaseController { ...@@ -144,7 +146,24 @@ public class RegUnitInfoController extends BaseController {
} }
// @TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false) @TycloudOperation(needAuth = false, ApiLevel = UserType.AGENCY)
@GetMapping(value = "/child-list")
@ApiOperation(httpMethod = "GET", value = "根据字典类型type和desc查询字典列表", notes = "根据字典类型type和desc查询字典列表")
public ResponseModel<List<DataDictionary>> getChildList(@RequestParam(value = "type") String type,
@RequestParam(value = "group") String group) {
return ResponseHelper.buildResponse(iRegUnitInfoService.getChildList(type, group));
}
@TycloudOperation(needAuth = false, ApiLevel = UserType.AGENCY)
@GetMapping(value = "/dataDictionaryIdFillMenu")
@ApiOperation(httpMethod = "GET", value = "根据字典类型查询字典,id为SequenceNbr", notes = "根据字典类型查询字典,id为SequenceNbr")
public ResponseModel<List<DataDictionary>> getDictionaryWithTreeFillId(@RequestParam String type) {
return ResponseHelper.buildResponse(iRegUnitInfoService.getDictionaryWithTreeFillId(type));
}
// @TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false) @TycloudOperation(ApiLevel = UserType.AGENCY, needAuth = false)
@GetMapping(value = "/management-unit/tree") @GetMapping(value = "/management-unit/tree")
@ApiOperation(httpMethod = "GET", value = "管辖机构树", notes = "管辖机构树") @ApiOperation(httpMethod = "GET", value = "管辖机构树", notes = "管辖机构树")
......
...@@ -47,15 +47,12 @@ import org.apache.logging.log4j.Logger; ...@@ -47,15 +47,12 @@ import org.apache.logging.log4j.Logger;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.mock.web.MockMultipartFile; import org.springframework.mock.web.MockMultipartFile;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.util.StopWatch; import org.springframework.util.StopWatch;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -147,7 +144,7 @@ public class RegUnitInfoServiceImpl extends BaseService<RegUnitInfoDto, RegUnitI ...@@ -147,7 +144,7 @@ public class RegUnitInfoServiceImpl extends BaseService<RegUnitInfoDto, RegUnitI
private boolean isUgp; private boolean isUgp;
@Autowired @Autowired
private ApplicationContext applicationContext; DataDictionaryServiceImpl dataDictionaryService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -443,21 +440,67 @@ public class RegUnitInfoServiceImpl extends BaseService<RegUnitInfoDto, RegUnitI ...@@ -443,21 +440,67 @@ public class RegUnitInfoServiceImpl extends BaseService<RegUnitInfoDto, RegUnitI
@Override @Override
public List<DataDictionary> getUnitTypeList() { public List<DataDictionary> getUnitTypeList() {
return iDataDictionaryService.getByType(DICT_TYPE_UNIT_TYPE); return this.setAndGetUnitTypeList();
} }
public List<DataDictionary> setAndGetUnitTypeList() { public List<DataDictionary> setAndGetUnitTypeList() {
List<DataDictionary> dataDictionaries; List<DataDictionary> dataDictionaries;
// 先从Redis缓存中获取值
if(redisUtil.hasKey(BizCommonConstant.UNIT_TYPE_LIST_REDIS_KEY)){ if(redisUtil.hasKey(BizCommonConstant.UNIT_TYPE_LIST_REDIS_KEY)){
dataDictionaries = JSONObject.parseArray(redisUtil.get(BizCommonConstant.UNIT_TYPE_LIST_REDIS_KEY).toString(),DataDictionary.class); dataDictionaries = JSONObject.parseArray(redisUtil.get(BizCommonConstant.UNIT_TYPE_LIST_REDIS_KEY).toString(),DataDictionary.class);
} else { return dataDictionaries;
dataDictionaries = iDataDictionaryService.getByType(DICT_TYPE_UNIT_TYPE); }
redisUtil.set(BizCommonConstant.UNIT_TYPE_LIST_REDIS_KEY,JSONObject.toJSONString(dataDictionaries)); // 在同步块内再次检查缓存,以避免多个线程同时查不到缓存时重复查询数据库
synchronized (this){
if(redisUtil.hasKey(BizCommonConstant.UNIT_TYPE_LIST_REDIS_KEY)){
dataDictionaries = JSONObject.parseArray(redisUtil.get(BizCommonConstant.UNIT_TYPE_LIST_REDIS_KEY).toString(),DataDictionary.class);
} else{
dataDictionaries = iDataDictionaryService.getByType(DICT_TYPE_UNIT_TYPE);
redisUtil.set(BizCommonConstant.UNIT_TYPE_LIST_REDIS_KEY,JSONObject.toJSONString(dataDictionaries));
}
} }
return dataDictionaries; return dataDictionaries;
} }
@Override
public List<DataDictionary> getChildList(String type, String group) {
List<DataDictionary> dictionaries = this.initAllDataDictionaryList();
return dictionaries.stream().parallel().filter(d->d.getType().equals(type) && d.getTypeDesc().equals(group)).collect(Collectors.toList());
}
@Override
public void setAllDataDictionaryList(){
this.initAllDataDictionaryList();
}
@Override
public List<DataDictionary> getDictionaryWithTreeFillId(String type) {
List<DataDictionary> dictionaries = this.initAllDataDictionaryList();
return dictionaries.stream().parallel().filter(d->d.getType().equals(type)).collect(Collectors.toList());
}
private List<DataDictionary> initAllDataDictionaryList() {
List<DataDictionary> dictionaries;
// 使用双重检查锁定
if (redisUtil.hasKey(BizCommonConstant.TCM_ALL_DATA_DICT_REDIS_KEY)) {
String json = redisUtil.get(BizCommonConstant.TCM_ALL_DATA_DICT_REDIS_KEY).toString();
dictionaries = JSONObject.parseArray(json, DataDictionary.class);
return dictionaries;
}
synchronized (this) {
if (redisUtil.hasKey(BizCommonConstant.TCM_ALL_DATA_DICT_REDIS_KEY)) {
String json = redisUtil.get(BizCommonConstant.TCM_ALL_DATA_DICT_REDIS_KEY).toString();
dictionaries = JSONObject.parseArray(json, DataDictionary.class);
} else{
dictionaries = dataDictionaryService.list();
redisUtil.set(BizCommonConstant.TCM_ALL_DATA_DICT_REDIS_KEY, JSONObject.toJSONString(dictionaries));
}
}
return dictionaries;
}
@Override @Override
public Collection getManagementUnitTree(String orgCode) { public Collection getManagementUnitTree(String orgCode) {
......
...@@ -651,17 +651,27 @@ public class UnitInfoServiceImpl extends BaseService<UnitInfoDto, UnitInfo, Unit ...@@ -651,17 +651,27 @@ public class UnitInfoServiceImpl extends BaseService<UnitInfoDto, UnitInfo, Unit
return result; return result;
} }
public Collection<RegionModel> getAllRegionTree(){ public Collection<RegionModel> getAllRegionTree() {
Collection<RegionModel> result = null; Collection<RegionModel> result;
if(redisUtil.hasKey(BizCommonConstant.REGION_TREE_REDIS_KEY)){ // 先从Redis缓存中获取值
result = JSONObject.parseArray(redisUtil.get(BizCommonConstant.REGION_TREE_REDIS_KEY).toString(),RegionModel.class); if (redisUtil.hasKey(BizCommonConstant.REGION_TREE_REDIS_KEY)) {
} else { result = JSONObject.parseArray(redisUtil.get(BizCommonConstant.REGION_TREE_REDIS_KEY).toString(), RegionModel.class);
result = Systemctl.regionClient.queryForTree(null).getResult(); return result;
redisUtil.set(BizCommonConstant.REGION_TREE_REDIS_KEY,JSONObject.toJSONString(result));
} }
// 在同步块内再次检查缓存,以避免多个线程同时查不到缓存时重复查询数据库
synchronized (this) {
if (redisUtil.hasKey(BizCommonConstant.REGION_TREE_REDIS_KEY)) {
result = JSONObject.parseArray(redisUtil.get(BizCommonConstant.REGION_TREE_REDIS_KEY).toString(), RegionModel.class);
} else {
result = Systemctl.regionClient.queryForTree(null).getResult();
redisUtil.set(BizCommonConstant.REGION_TREE_REDIS_KEY, JSONObject.toJSONString(result));
}
}
return result; return result;
} }
/** /**
* 去区域树中level多余空格 * 去区域树中level多余空格
* @param result * @param result
......
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