美文网首页
ES同步数据使用切面进行实时更新

ES同步数据使用切面进行实时更新

作者: 一个忙来无聊的人 | 来源:发表于2020-08-29 14:03 被阅读0次

    以前公司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;
        }
    }
    
    
    
    

    相关文章

      网友评论

          本文标题:ES同步数据使用切面进行实时更新

          本文链接:https://www.haomeiwen.com/subject/fmgdsktx.html