提交 5874e615 编写于 作者: sq3536's avatar sq3536

规避一级缓存反序列化瓶颈

上级 fad6a070
......@@ -6,6 +6,7 @@ import cn.ibizlab.core.extensions.cql.ExecResult;
import cn.ibizlab.core.extensions.domain.BaseRequest;
import cn.ibizlab.core.extensions.domain.ResultsMQMsg;
import cn.ibizlab.core.extensions.util.DefaultMQProducerService;
import cn.ibizlab.core.extensions.util.ExpiryMap;
import cn.ibizlab.core.extensions.util.MsgProducerService;
import cn.ibizlab.core.lite.extensions.domain.FieldObj;
import cn.ibizlab.core.lite.extensions.domain.ModelObj;
......@@ -40,9 +41,6 @@ public class AnalyseEntityServiceImpl extends BaseEntityServiceImpl {
@Lazy
private DABuildExService daBuildExService;
@Autowired
@Lazy
private DictDstService dictDstService;
@Override
public void saveResult(ModelObj param, String RULEID,String RULECODE, String RULENAME, String RU_EXECRESULTNAME, FieldObj BUSINESSCAT,
......@@ -109,7 +107,7 @@ public class AnalyseEntityServiceImpl extends BaseEntityServiceImpl {
if((!StringUtils.isEmpty(result.getRuleid()))&&(!StringUtils.isEmpty(result.getDomainsfield()))&&(!StringUtils.isEmpty(result.getKeyvaluefield()))&&(!ObjectUtils.isEmpty(result.getTimefield()))) {
result.setUpdatedate(ExecResult.nowLocalDate());
List<DADimension> dims=daBuildExService.getDims(result.getBusinesscat());
List<DADimension> dims=getDims(result.getBusinesscat());
if(dims!=null) {
ArrayList<ExecResult> results = new ArrayList<>();
for (DADimension dim : dims) {
......@@ -121,7 +119,7 @@ public class AnalyseEntityServiceImpl extends BaseEntityServiceImpl {
if(!StringUtils.isEmpty(dictname))
{
CodeList codeList = dictDstService.getCodeListCatalog(dictname);
CodeList codeList = this.getCodeListCatalog(dictname);
//维度指定代码表时,向上同时为每一个父节点添加一条数据
while(true)
{
......@@ -296,4 +294,18 @@ public class AnalyseEntityServiceImpl extends BaseEntityServiceImpl {
this.ruExecLogService.update(execlog);
return execlog;
}
private ExpiryMap<String,List<DADimension>> dimlistMap=new ExpiryMap<>();
public List<DADimension> getDims(String id)
{
List<DADimension> dims=dimlistMap.get("dims"+id);
if(dims==null)
{
dims=daBuildExService.get(id).getDadimension();
if(dims!=null)
dimlistMap.put("dims"+id,dims);
}
return dims;
}
}
......@@ -2,6 +2,7 @@ package cn.ibizlab.core.extensions.service;
import cn.ibizlab.core.analysis.domain.DADimension;
import cn.ibizlab.core.dict.extensions.service.DictDstService;
import cn.ibizlab.core.extensions.util.ExpiryMap;
import cn.ibizlab.core.rule.domain.ExecResult;
import cn.ibizlab.core.extensions.domain.BaseRequest;
import cn.ibizlab.core.lite.extensions.domain.FieldObj;
......@@ -32,13 +33,13 @@ import java.util.List;
public class AnalyseSqlServiceImpl extends BaseEntityServiceImpl {
@Autowired
@Lazy
private DABuildExService daBuildExService;
@Autowired
@Lazy
private DictDstService dictDstService;
@Autowired
......@@ -111,7 +112,7 @@ public class AnalyseSqlServiceImpl extends BaseEntityServiceImpl {
if((!StringUtils.isEmpty(result.getRuleId()))&&(!StringUtils.isEmpty(result.getKeyValueField()))) {
List<DADimension> dims=daBuildExService.getDims(result.getBusinessCat());
List<DADimension> dims=getDims(result.getBusinessCat());
if(dims!=null) {
for (DADimension dim : dims) {
......@@ -123,7 +124,7 @@ public class AnalyseSqlServiceImpl extends BaseEntityServiceImpl {
if(!StringUtils.isEmpty(dictname))
{
CodeList codeList = dictDstService.getCodeListCatalog(dictname);
CodeList codeList = this.getCodeListCatalog(dictname);
//维度指定代码表时,向上同时为每一个父节点添加一条数据
while(true)
{
......@@ -299,4 +300,19 @@ public class AnalyseSqlServiceImpl extends BaseEntityServiceImpl {
this.ruExecLogService.update(execlog);
return execlog;
}
private ExpiryMap<String,List<DADimension>> dimlistMap=new ExpiryMap<>();
public List<DADimension> getDims(String id)
{
List<DADimension> dims=dimlistMap.get("dims"+id);
if(dims==null)
{
dims=daBuildExService.get(id).getDadimension();
if(dims!=null)
dimlistMap.put("dims"+id,dims);
}
return dims;
}
}
package cn.ibizlab.core.extensions.service;
import cn.ibizlab.core.analysis.domain.DADimension;
import cn.ibizlab.core.dict.extensions.service.DictDstService;
import cn.ibizlab.core.extensions.domain.BaseRequest;
import cn.ibizlab.core.extensions.util.ExpiryMap;
import cn.ibizlab.core.lite.extensions.domain.FieldObj;
import cn.ibizlab.core.lite.extensions.domain.ModelObj;
import cn.ibizlab.core.rule.domain.ExecLog;
import cn.ibizlab.core.rule.domain.ExecResult;
import cn.ibizlab.core.rule.service.IExecLogService;
import cn.ibizlab.core.rule.service.IExecResultService;
import cn.ibizlab.util.dict.CodeList;
import cn.ibizlab.util.helper.CachedBeanCopier;
import cn.ibizlab.util.helper.DataObject;
import cn.ibizlab.util.helper.RuleUtils;
......@@ -26,6 +30,7 @@ import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.FactHandle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
......@@ -570,4 +575,25 @@ public class BaseEntityServiceImpl implements BaseEntityService
this.ruExecLogService.update(execlog);
return execlog;
}
@Autowired
@Lazy
private DictDstService dictDstService;
private ExpiryMap<String,CodeList> codelistMap=new ExpiryMap<>();
public CodeList getCodeListCatalog(String dictname)
{
CodeList codeList = codelistMap.get(dictname);
if(codeList==null)
{
codeList=dictDstService.getCodeListCatalog(dictname);
if(codeList!=null)
codelistMap.put(dictname,codeList);
}
return codeList;
}
}
\ No newline at end of file
package cn.ibizlab.core.extensions.util;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* <p>
* Title: ExpireMap
* </p>
*
* <p>
* Description: 设置map过期时间
* </p>
*
* <p>
* Company:
* </p>
*
* @author
*
* @since:2020-7-28 下午05:23:25
*
*/
public class ExpiryMap<K, V> extends HashMap<K, V> {
private static final long serialVersionUID = 1L;
/**
* 过期时间设置为3分钟,可以修改
*/
private long EXPIRY = 1000 * 60 * 10;
private HashMap<K, Long> expiryMap = new HashMap();
public ExpiryMap() {
super();
}
public ExpiryMap(long defaultExpiryTime) {
this(1 << 4, defaultExpiryTime);
}
public ExpiryMap(int initialCapacity, long defaultExpiryTime) {
super(initialCapacity);
this.EXPIRY = defaultExpiryTime;
}
public V put(K key, V value) {
expiryMap.put(key, System.currentTimeMillis() + EXPIRY);
return super.put(key, value);
}
public boolean containsKey(Object key) {
return !checkExpiry(key, true) && super.containsKey(key);
}
/**
* @param key
* @param value
* @param expiryTime
* 键值对有效期 毫秒
* @return
*/
public V put(K key, V value, long expiryTime) {
expiryMap.put(key, System.currentTimeMillis() + expiryTime);
return super.put(key, value);
}
public int size() {
return entrySet().size();
}
public boolean isEmpty() {
return entrySet().size() == 0;
}
public boolean containsValue(Object value) {
if (value == null)
return Boolean.FALSE;
Set<java.util.Map.Entry<K, V>> set = super.entrySet();
Iterator<java.util.Map.Entry<K, V>> iterator = set.iterator();
while (iterator.hasNext()) {
java.util.Map.Entry<K, V> entry = iterator.next();
if (value.equals(entry.getValue())) {
if (checkExpiry(entry.getKey(), false)) {
iterator.remove();
return Boolean.FALSE;
} else
return Boolean.TRUE;
}
}
return Boolean.FALSE;
}
public Collection<V> values() {
Collection<V> values = super.values();
if (values == null || values.size() < 1)
return values;
Iterator<V> iterator = values.iterator();
while (iterator.hasNext()) {
V next = iterator.next();
if (!containsValue(next))
iterator.remove();
}
return values;
}
public V get(Object key) {
if (key == null)
return null;
if (checkExpiry(key, true))
return null;
return super.get(key);
}
/**
*
* @Description: 是否过期
* @param key
* @return null:不存在或key为null -1:过期 存在且没过期返回value 因为过期的不是实时删除,所以稍微有点作用
*/
public Object isInvalid(Object key) {
if (key == null)
return null;
if (!expiryMap.containsKey(key)) {
return null;
}
long expiryTime = expiryMap.get(key);
boolean flag = System.currentTimeMillis() > expiryTime;
if (flag) {
super.remove(key);
expiryMap.remove(key);
return -1;
}
return super.get(key);
}
public void putAll(Map<? extends K, ? extends V> m) {
for (Map.Entry<? extends K, ? extends V> e : m.entrySet())
expiryMap.put(e.getKey(), System.currentTimeMillis() + EXPIRY);
super.putAll(m);
}
public Set<Map.Entry<K, V>> entrySet() {
Set<java.util.Map.Entry<K, V>> set = super.entrySet();
Iterator<java.util.Map.Entry<K, V>> iterator = set.iterator();
while (iterator.hasNext()) {
java.util.Map.Entry<K, V> entry = iterator.next();
if (checkExpiry(entry.getKey(), false))
iterator.remove();
}
return set;
}
/**
*
* @Description: 是否过期
* @param
*
* @param isRemoveSuper
* true super删除
* @return
*/
private boolean checkExpiry(Object key, boolean isRemoveSuper) {
if (!expiryMap.containsKey(key)) {
return Boolean.FALSE;
}
long expiryTime = expiryMap.get(key);
boolean flag = System.currentTimeMillis() > expiryTime;
if (flag) {
if (isRemoveSuper)
super.remove(key);
expiryMap.remove(key);
}
return flag;
}
}
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册