spring事件-实际应用案例

使用类: ApiRoleServiceImpl.java

方法:handleRoleList

package com.cwp.system.center.service.impl;

import com.cwp.data.intelligence.common.exception.RRException;
import com.cwp.system.center.config.properties.SystemCenterConfig;
import com.cwp.system.center.constant.RoleTypeEnum;
import com.cwp.system.center.entity.SysRoleEntity;
import com.cwp.system.center.model.dto.ApiRoleDto;
import com.cwp.system.center.model.dto.SyncRoleData;
import com.cwp.system.center.model.event.SyncRoleEvent;
import com.cwp.system.center.service.ApiRoleService;
import com.cwp.system.center.service.SysRoleService;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.ListUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @ClassName ApiRoleServiceImpl
 * @Description TODO
 * @Author Getech
 * @Date 2020/9/4 15:32
 */
@Slf4j
@Service
public class ApiRoleServiceImpl implements ApiRoleService {

    @Autowired
    private SysRoleService sysRoleService;

    @Autowired
    private SystemCenterConfig systemCenterConfig;

    @Autowired
    private ApplicationContext applicationContext;


    /**
    * @Description 处理角色列表
    * @Author  chengweiping
    * @Date   2020/9/4 15:33
    */
    @Override
    @Transactional(rollbackFor = {Exception.class, RRException.class},isolation = Isolation.READ_COMMITTED)
    public void handleRoleList(List<ApiRoleDto> apiRoleDtoList, String apiAccessToken) {
        if(CollectionUtil.isEmpty(apiRoleDtoList)){
            return;
        }
      //获取接口拿到的所有角色
      List<SysRoleEntity>  roleListFromPoros=apiRoleDtoList.stream().map(e->{
            SysRoleEntity sysRoleEntity=new SysRoleEntity();
            sysRoleEntity.setRoleId(e.getId());
            sysRoleEntity.setCreateTime(new Date());
            sysRoleEntity.setCreateUserId(0L);
            sysRoleEntity.setRoleName(e.getName());
            //根据技术中台角色编码查询出对应的角色类型
            String roleCode=e.getCode();
            Integer roleType= RoleTypeEnum.User.findRoleTypeByPorosRoleCode(roleCode);
            sysRoleEntity.setRoleType(roleType);
            sysRoleEntity.setRoleCode(e.getCode());
            return sysRoleEntity;
        }).collect(Collectors.toList());

        //获取数据库中拿到的所有角色
        List<SysRoleEntity>  roleListFromDB=sysRoleService.list();

        List<Long>  roleIdListFromDB=roleListFromDB.stream().map(SysRoleEntity::getRoleId).collect(Collectors.toList());
        //从接口数据中找出在数据库中没有的角色列表:进行新增角色处理
        List<SysRoleEntity> addRoleList=roleListFromPoros.stream().filter(e->{
            return !roleIdListFromDB.contains(e.getRoleId());
        }).collect(Collectors.toList());
        //新增角色
        batchAddRole(addRoleList);


        //从数据库数据中找出在接口没有的角色列表:进行删除角色处理
        List<Long>  roleIdListFromPoros=roleListFromDB.stream().map(SysRoleEntity::getRoleId).collect(Collectors.toList());
        List<SysRoleEntity> deleteRoleList=roleListFromDB.stream().filter(e->{
            return !roleIdListFromPoros.contains(e.getRoleId());
        }).collect(Collectors.toList());
        batchDeleteRole(deleteRoleList);

        //找出数据库与接口中都存在的角色列表,进行更新处理
       // List<Long> updateRoleIdList=ListUtils.intersection(roleListFromPoros,roleIdListFromDB);
        List<SysRoleEntity> upadateRoleList= roleListFromPoros.stream().filter(e->{
            return roleIdListFromDB.contains(e.getRoleId());
        }).collect(Collectors.toList());
        batchUpdateRole(upadateRoleList);

        //业务逻辑解耦,发布同步角色事件,进行其他逻辑处理
        SyncRoleData  syncRoleData =new SyncRoleData();
        syncRoleData.setApiAccessToken(apiAccessToken);
        syncRoleData.setAddRoleList(addRoleList);
        syncRoleData.setUpadateRoleList(upadateRoleList);
        syncRoleData.setDeleteRoleList(deleteRoleList);
        syncRoleData.setRoleListFromPoros(roleListFromPoros);
        SyncRoleEvent syncRoleEvent=new SyncRoleEvent(this,syncRoleData);
        try{
            applicationContext.publishEvent(syncRoleEvent);
        }catch (Exception e){
            log.error("发布同步事件异常",e);
        }

    }

    /**
    * @Description 新增角色
    * @Author  chengweiping
    * @Date   2020/9/4 16:13
    */
    private void batchAddRole(List<SysRoleEntity>  addRoleList){
        if(CollectionUtil.isEmpty(addRoleList)){
            return;
        }

        //循环新增没角色数据
        for(SysRoleEntity sysRoleEntity:addRoleList){
            try{
                sysRoleService.saveOrUpdate(sysRoleEntity);
                saveRangerRole(sysRoleEntity);
            }catch (Exception e){
                log.error("循环更新角色异常,角色ID={}"+"异常",e);
            }

        }


    }


    /**
    * @Description  新增角色ranger权限
    * @Author  chengweiping
    * @Date   2020/9/4 16:17
    */
    private void saveRangerRole(SysRoleEntity sysRoleEntity ){
        //新增对应的数据
        JSONObject rangerGroup = new JSONObject();
        rangerGroup.put("name",systemCenterConfig.getRolePreffix() + sysRoleEntity.getRoleId());
        rangerGroup.put("isVisible",1);
        rangerGroup.put("description",sysRoleEntity.getRoleName());
        //所有操作权限的用户
        try {
            String runUrl = systemCenterConfig.getClientUrl() + "/bdp/ranger/addRangerGroup";
            String result = HttpUtil.post(runUrl, rangerGroup.toJSONString(), 2000);
            log.info("保存ranger-角色   res:{}",result);
        } catch (Exception e) {
            log.error("保存ranger-角色:{}异常,error:{}", rangerGroup, e.getMessage());
        }
    }


    /**
    * @Description 删除角色处理
    * @Author  chengweiping
    * @Date   2020/9/4 16:24
    */
    private void batchDeleteRole(List<SysRoleEntity>  deleteRoleList){
        if(CollectionUtil.isEmpty(deleteRoleList)){
            return;
        }

        //循环删除没有绑定用户的角色数据,需一个个删除,这样互相不影响
       for(SysRoleEntity sysRoleEntity:deleteRoleList){
           try{
               sysRoleService.deleteBatch(new Long[]{sysRoleEntity.getRoleId()});
           }catch (Exception e){
               log.error("循环删除角色异常,角色ID={}"+"异常",e);
           }

       }

    }

    /**
    * @Description  更新角色列表
    * @Author  chengweiping
    * @Date   2020/9/4 16:59
    */
    private void batchUpdateRole(List<SysRoleEntity>  updateRoleList){
        if(CollectionUtil.isEmpty(updateRoleList)){
            return;
        }

        //循环删除没有绑定用户的角色数据,需一个个删除,这样互相不影响
        for(SysRoleEntity sysRoleEntity:updateRoleList){
            try{
                sysRoleService.updateById(sysRoleEntity);
            }catch (Exception e){
                log.error("循环更新角色异常,角色ID={}"+"异常",e);
            }

        }

    }
}
事件类:SyncRoleEvent.java
package com.cwp.system.center.model.event;

import com.cwp.system.center.model.dto.SyncRoleData;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;

/**
 * @ClassName SyncRoleEvent
 * @Description TODO
 * @Author Getech
 * @Date 2020/9/7 11:30
 */
@Getter
public class SyncRoleEvent extends ApplicationEvent {

    //同步角色附带的角色数据
    private SyncRoleData syncRoleData;

    public SyncRoleEvent(Object source, SyncRoleData syncRoleData) {
        super(source);
        this.syncRoleData=syncRoleData;
    }
}

监听器类:SyncRoleListener.java

package com.cwp.system.center.service.listener;

import com.cwp.system.center.entity.SysRoleEntity;
import com.cwp.system.center.model.dto.SyncRoleData;
import com.cwp.system.center.model.event.SyncRoleEvent;
import com.cwp.system.center.service.ApiUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @ClassName SyncRoleListener
 * @Description 同步角色监听器
 * @Date 2020/9/7 14:05
 */
@Component
@Slf4j
public class SyncRoleListener {

    @Autowired
    private ApiUserService apiUserService;

    /**
    * @Description 同步用户角色-监听方法(处理新增角色下的用户数据,以及新增用户-角色关联数据)
    * @Author  chengweiping
    * @Date   2020/9/7 15:44
    */
    @EventListener
    public void  syncUserRole(SyncRoleEvent syncRoleEvent){
        SyncRoleData syscRoleData= syncRoleEvent.getSyncRoleData();
        String apiAccessToken=syscRoleData.getApiAccessToken();
        log.info("进入监听同步角色方法syncUserRole,token={}",apiAccessToken);
        List<SysRoleEntity> roleListFormPoros= syscRoleData.getRoleListFromPoros();
        apiUserService.synUserRole(apiAccessToken,roleListFormPoros);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成伟平2022

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值