Sfoglia il codice sorgente

fix: RedisKeyExpirationListener逻辑优化

hidewnd 1 mese fa
parent
commit
1d09fa6d00

+ 44 - 22
yt-question/yt-question-service/src/main/java/com/ytpm/question/monitor/RedisKeyExpirationListener.java

@@ -1,5 +1,6 @@
 package com.ytpm.question.monitor;
 
+import cn.hutool.core.util.StrUtil;
 import com.ytpm.agent.enums.UserStatusEnum;
 import com.ytpm.app.model.YtDyzUser;
 import com.ytpm.feign.RiskFeign;
@@ -11,8 +12,8 @@ import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.data.redis.connection.Message;
 import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
+import org.springframework.lang.NonNull;
 import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.annotation.Resource;
 import java.util.Objects;
@@ -33,6 +34,9 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
     @Value("${spring.application.name:}")
     private String applicationName;
 
+    private static final String FLAG_LOCK = "lock";
+    private static final String FLAG_UNLOCK = "unlock";
+
     /**
      *
      * @param listenerContainer must not be {@literal null}.
@@ -45,44 +49,62 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
      * 监听redis过期的 key 进行处理
      */
     @Override
-    public void onMessage(Message message, byte[] pattern) {
+    public void onMessage(@NonNull Message message, byte[] pattern) {
         String key = String.valueOf(message);
+        // 全局监听
         if (key.startsWith("lock_") || key.startsWith("unlock_")) {
-            log.info("App-Service 发现预定风控用户:{}", key);
-        }
-        // 用户锁定
-        if (key.startsWith("lock_")) {
             String[] arr = key.split("_");
-            lockUser(arr[1], UserStatusEnum.RISK.getCode());
+            if (arr.length < 2) {
+                return;
+            }
+            handleUserLock(key, arr[1], arr[0]);
         }
-        // 用户解锁
-        if (key.startsWith("unlock_")) {
+        // 仅限自身服务的监听
+        String serviceKey = StrUtil.replace(applicationName, "-service", "");
+        if (key.startsWith(serviceKey)) {
             String[] arr = key.split("_");
-            YtDyzUser user = appUserMapper.selectPrimaryKey(arr[1]);
-            if (user == null) {
+            if (arr.length < 3) {
                 return;
             }
-            YtDyzUser dyzUser = new YtDyzUser();
-            dyzUser.setUserId(arr[1]);
-            dyzUser.setUserStatus(1);
-            appUserMapper.updateUser(dyzUser);
-            riskFeign.addBlockingRecord(arr[1]);
+            handleUserLock(key, arr[2], arr[1]);
+        }
+    }
+
+    private void handleUserLock(String key, String userId, String flag) {
+        YtDyzUser dyzUser = appUserMapper.selectPrimaryKey(userId);
+        if (Objects.nonNull(dyzUser)) {
+            log.info("App-Service 发现预定风控用户:{}", key);
+            // 用户锁定
+            if (FLAG_LOCK.equals(flag)) {
+                lockUser(dyzUser, UserStatusEnum.RISK.getCode());
+            }
+            // 用户解锁
+            if (FLAG_UNLOCK.equals(flag)) {
+                unLockUser(dyzUser);
+            }
         }
     }
 
     /**
      * 锁定用户
      */
-    private void lockUser(@RequestParam("userId") String userId, @RequestParam("userStatus") Integer userStatus) {
-        YtDyzUser dyzUser = appUserMapper.selectPrimaryKey(userId);
+    private void lockUser(YtDyzUser dyzUser, Integer userStatus) {
         YtDyzUser newUser = new YtDyzUser();
-        newUser.setUserId(userId);
+        newUser.setUserId(dyzUser.getUserId());
         newUser.setUserStatus(userStatus);
         newUser.setRiskReason(BannedTypeEnum.CHANNEL.getDesc() + "禁止登录");
-        if (Objects.nonNull(dyzUser)) {
-            appUserMapper.updateUser(newUser);
-        }
+        appUserMapper.updateUser(newUser);
     }
 
+    /**
+     * 解锁用户
+     */
+    private void unLockUser(YtDyzUser dyzUser) {
+        YtDyzUser newUser = new YtDyzUser();
+        newUser.setUserId(dyzUser.getUserId());
+        newUser.setUserStatus(UserStatusEnum.NORMAL.getCode());
+        appUserMapper.updateUser(newUser);
+        riskFeign.addBlockingRecord(dyzUser.getUserId());
+    }
 
 }