以前公司ES使用是直接定时同步,对数据实时性要求不是很高。
当前公司使用sass平台要求实时同步数据,这样才能实时搜索到。最终使用切面方式进行数据同步
定义一个切面,然后同步数据
viewSupport.updateAll(assetIdList, null); 该方法是自定义的一个业务逻辑处理方法,和功能关系不大,主要作用是通过参数去查询需要更新的数据列表,然后再同步到ES。
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xiaoxiao.ams.common.core.CommonConstants;
import com.xiaoxiao.ams.dataaccess.entity.asset.AssetDO;
import com.xiaoxiao.ams.service.view.constant.AssetMethodType;
import com.xiaoxiao.ams.service.view.support.ViewSupport;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: xiaoxiao
* @Date: 2020/7/28 17:03
* @Desc: 同步数据支持
*/
@Aspect
@Component
public class ViewSyncSupport {
Logger logger = LoggerFactory.getLogger(ViewSyncSupport.class);
private final String EXAMPLE_ID = "id in";
@Autowired
private ViewSupport viewSupport;
// 切mapper
// 由于sass平台所有操作基本围绕资产进行,所以业务需求仅仅需要切资产操作数据库的mapper的所有方法即可 (实际使用中可以考虑切其他类方法)
@Around("execution(* com.xiaoxiao.ams.mapper.AssetMapper.*(..))")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object proceed = pjp.proceed();
String method = pjp.getSignature().getName();
Object[] args = pjp.getArgs();
// 如果改变的是一个列表,需要修改这个列表的所有数据
if (AssetMethodType.dataListMap().containsKey(method)) {
List<Long> assetIdList = getAssetIdList(args[0]);
if (CollUtil.isNotEmpty(assetIdList)){
// 通过列表去同步数据
viewSupport.updateAll(assetIdList, null);
}
// 如果使用的是mybatis的Example ,需要根据业务逻辑获取主键id数据列表信息
} else if (AssetMethodType.dataExampleMap().containsKey(method)) {
List<Long> assetIdList = new ArrayList<>();
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(args[1]), JSONObject.class);
JSONArray jsonArray = jsonObject.getJSONArray("oredCriteria");
for (Object obj : jsonArray) {
JSONObject jsonObject1 = JSONObject.parseObject(JSON.toJSONString(obj), JSONObject.class);
JSONArray allCriteria = jsonObject1.getJSONArray("allCriteria");
for (Object allCriterion : allCriteria) {
JSONObject criterion = JSONObject.parseObject(JSON.toJSONString(allCriterion), JSONObject.class);
if (EXAMPLE_ID.equals(criterion.getString("condition"))){
List<Long> longs = JSONObject.parseArray(JSONObject.toJSONString(criterion.get("value")), Long.class);
assetIdList.addAll(longs);
}
}
}
if (CollUtil.isNotEmpty(assetIdList)){
viewSupport.updateAll(assetIdList, null);
}
// 方法直接通过唯一主键id 进行操作
} else if (AssetMethodType.dataUpdateMap().containsKey(method)) {
List<Long> assetIdList = getAssetIdList(args);
if (CollUtil.isNotEmpty(assetIdList)){
viewSupport.updateAll(assetIdList, null);
}
// 方法通过唯一编码进行操作
} else if (AssetMethodType.dataAddMap().containsKey(method)) {
List<String> assetCodeList = getAssetCodeList(args);
if (CollUtil.isNotEmpty(assetCodeList)){
viewSupport.updateAll(null, assetCodeList);
}
} else if (AssetMethodType.UPDATE_ASSET_LEAVE_EMPLOYEE.getMethodName().equals(method)) {
List<Long> assetIdList = JSONObject.parseArray(JSON.toJSONString(args[0]), Long.class);
if (CollUtil.isNotEmpty(assetIdList)){
viewSupport.updateAll(assetIdList, null);
}
} else if (AssetMethodType.INSERT_LIST.getMethodName().equals(method)) {
List<String> assetCodeList = getAssetCodeList(args[0]);
if (CollUtil.isNotEmpty(assetCodeList)){
viewSupport.updateAll(null, assetCodeList);
}
// 如果没有在修改、删除、新增的方法里面。直接忽略
}else {
return proceed;
}
return proceed;
}
private List<Long> getAssetIdList(Object args) {
List<Long> assetIds = new ArrayList<>(CommonConstants.NUMBER_TEN);
List<AssetDO> assetDOS = JSONObject.parseArray(JSONObject.toJSONString(args), AssetDO.class);
if (CollUtil.isNotEmpty(assetDOS)) {
for (AssetDO assetDO : assetDOS) {
assetIds.add(assetDO.getId());
}
}
return assetIds;
}
private List<String> getAssetCodeList(Object args) {
List<String> assetCodes = new ArrayList<>(CommonConstants.NUMBER_TEN);
List<AssetDO> assetDOS = JSONObject.parseArray(JSONObject.toJSONString(args), AssetDO.class);
if (CollUtil.isNotEmpty(assetDOS)) {
for (AssetDO assetDO : assetDOS) {
assetCodes.add(assetDO.getAssetCode());
}
}
return assetCodes;
}
}
枚举类,用于存放切面类的方法名称,比如所有增、删、改方法设计数据变动
package com.xiaoxiao.ams.service.view.constant;
import com.xiaoxiao.ams.common.core.CommonConstants;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: xiaoxiao
* @Date: 2020/7/28 19:42
* @Desc:
*/
public enum AssetMethodType {
// 所有修改的方法名称
UPDATE_BATCH_USE_STATUS("updateBatchUseStatus"),
UPDATE_BATCH_ASSET_USE_STATUS("updateBatchAssetUseStatus"),
UPDATE_BATCH_ASSET_STATUS("updateBatchAssetStatus"),
UPDATE_BATCH_EXTEND_INFO("updateBatchExtendInfo"),
UPDATE_LIST("updateList"),
UPDATE_CLOUD_STORAGE_LIST("updateCloudStorageList"),
// List<Long> assetIdListc
UPDATE_ASSET_LEAVE_EMPLOYEE("updateAssetLeaveEmployee"),
UPDATE_BY_EXAMPLE("updateByExample"),
UPDATE_BY_EXAMPLE_SELECTIVE("updateByExampleSelective"),
UPDATE_BY_ID("updateById"),
UPDATE_BY_PRIMARY_KEY("updateByPrimaryKey"),
UPDATE_BY_PRIMARY_KEY_SELECTIVE("updateByPrimaryKeySelective"),
// 所有新增的方法名称
INSERT_LIST("insertList"),
INSERT_SELECTIVE("insertSelective"),
INSERT("insert"),
INSERT_USE_GENERATED_KEYS("insertUseGeneratedKeys"),
;
private String methodName;
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
AssetMethodType(String methodName) {
this.methodName = methodName;
}
/**
* 通过 List<AssetDO>
* 入参是list列表集合入参,需要批量处理每一个管理数据信息
* @return
*/
public static Map<String, Object> dataListMap(){
Map<String, Object> map = new HashMap<>(CommonConstants.NUMBER_EIGHT * 2);
map.put(UPDATE_BATCH_USE_STATUS.getMethodName(), UPDATE_BATCH_USE_STATUS.getMethodName());
map.put(UPDATE_BATCH_ASSET_USE_STATUS.getMethodName(), UPDATE_BATCH_ASSET_USE_STATUS.getMethodName());
map.put(UPDATE_BATCH_ASSET_STATUS.getMethodName(), UPDATE_BATCH_ASSET_STATUS.getMethodName());
map.put(UPDATE_BATCH_EXTEND_INFO.getMethodName(), UPDATE_BATCH_EXTEND_INFO.getMethodName());
map.put(UPDATE_LIST.getMethodName(), UPDATE_LIST.getMethodName());
map.put(UPDATE_CLOUD_STORAGE_LIST.getMethodName(), UPDATE_CLOUD_STORAGE_LIST.getMethodName());
return map;
}
/**
* 通过 example mybatis的类
* @return
*/
public static Map<String, Object> dataExampleMap(){
Map<String, Object> map = new HashMap<>(CommonConstants.NUMBER_EIGHT );
map.put(UPDATE_BY_EXAMPLE.getMethodName(), UPDATE_BY_EXAMPLE.getMethodName());
map.put(UPDATE_BY_EXAMPLE_SELECTIVE.getMethodName(), UPDATE_BY_EXAMPLE_SELECTIVE.getMethodName());
return map;
}
/**
* 通过 AssetDO 单个实体类数据信息
* @return
*/
public static Map<String, Object> dataUpdateMap(){
Map<String, Object> map = new HashMap<>(CommonConstants.NUMBER_EIGHT );
map.put(UPDATE_BY_ID.getMethodName(), UPDATE_BY_ID.getMethodName());
map.put(UPDATE_BY_PRIMARY_KEY.getMethodName(), UPDATE_BY_PRIMARY_KEY.getMethodName());
map.put(UPDATE_BY_PRIMARY_KEY_SELECTIVE.getMethodName(), UPDATE_BY_PRIMARY_KEY_SELECTIVE.getMethodName());
return map;
}
/**
* 通过 AssetDO 单个实体类数据信息
* @return
*/
public static Map<String, Object> dataAddMap(){
Map<String, Object> map = new HashMap<>(CommonConstants.NUMBER_EIGHT );
map.put(INSERT_SELECTIVE.getMethodName(), INSERT_SELECTIVE.getMethodName());
map.put(INSERT.getMethodName(), INSERT.getMethodName());
map.put(INSERT_USE_GENERATED_KEYS.getMethodName(), INSERT_USE_GENERATED_KEYS.getMethodName());
return map;
}
}
网友评论