Pārlūkot izejas kodu

Merge branch 'package' of GameCenter/game-center into dev

zhimo 9 mēneši atpakaļ
vecāks
revīzija
8e70acfad7

+ 43 - 12
game-back/game-back-serve/src/main/java/com/zanxiang/game/back/serve/rpc/impl/TtAppBackRpcImpl.java

@@ -19,6 +19,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 
 import java.time.LocalDateTime;
 import java.util.Collections;
@@ -46,6 +47,8 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
     @Autowired
     private IDistributedLockComponent distributedLockComponent;
     @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+    @Autowired
     private IGameOceanengineAppCallbackService gameOceanengineAppCallbackService;
 
     @Override
@@ -131,7 +134,8 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
         }
         // 此处加锁防止 cp 方调用过快,导致查询回传结果时判断逻辑没走完
         String lockKey = com.zanxiang.game.back.base.ServerInfo.SERVER_NAME + ":TtAppOrderBack:" + dto.getGameId() + ":" + dto.getOrderId();
-        distributedLockComponent.doLock(lockKey, 0L, 60L, TimeUnit.SECONDS);
+        redisTemplate.opsForValue().set(lockKey, dto.getOrderId(), 2L, TimeUnit.MINUTES);
+        // distributedLockComponent.doLock(lockKey, 0L, 60L, TimeUnit.SECONDS);
         try {
             GameOceanengineAppOrderLog orderLog = GameOceanengineAppOrderLog.builder()
                     .userId(dto.getUserId())
@@ -166,7 +170,8 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
             gameOceanengineAppOrderLogService.save(orderLog);
             return ResultVO.ok(gameOceanengineAppOrderLogService.callback(orderLog));
         } finally {
-            distributedLockComponent.unlock(lockKey);
+            redisTemplate.delete(lockKey);
+            // distributedLockComponent.unlock(lockKey);
         }
     }
 
@@ -229,16 +234,15 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
     public ResultVO<OrderBackQueryRpcVO> orderBackQuery(TtAppOrderBackQueryRpcDTO dto) {
         log.error("头条APP订单回传结果查询:{}", JsonUtil.toString(dto));
 
-        // 加锁最大等待 60s
-        String lockKey = com.zanxiang.game.back.base.ServerInfo.SERVER_NAME + ":TtAppOrderBack:" + dto.getGameId() + ":" + dto.getOrderId();
-        distributedLockComponent.doLock(lockKey, 60, 1L, TimeUnit.SECONDS);
-
-        GameOceanengineAppOrderLog orderLog = gameOceanengineAppOrderLogService.getOne(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
-                .eq(GameOceanengineAppOrderLog::getOrderNo, dto.getOrderId())
-                .eq(GameOceanengineAppOrderLog::getGameId, dto.getGameId())
-                .eq(GameOceanengineAppOrderLog::getAgentKey, dto.getAgentKey())
-                .eq(GameOceanengineAppOrderLog::getUserId, dto.getUserId())
-        );
+        GameOceanengineAppOrderLog orderLog = queryOrder(dto);
+        if (orderLog == null) {
+            try {
+                Thread.sleep(5 *  1000L);
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+            orderLog = queryOrder(dto);
+        }
         if  (orderLog == null) {
             return ResultVO.ok(OrderBackQueryRpcVO.builder()
                             .doBack(Boolean.FALSE)
@@ -267,4 +271,31 @@ public class TtAppBackRpcImpl implements ITtAppBackRpc {
         GameOceanengineAppCallback callback = gameOceanengineAppCallbackService.getUserCallback(dto.getGameId(), dto.getImei(), dto.getOaid(), dto.getAndroidId(), dto.getIdfa(), dto.getCaid());
         return ResultVO.ok(callback == null ? null : callback.getAgentKey());
     }
+
+    private GameOceanengineAppOrderLog queryOrder(TtAppOrderBackQueryRpcDTO dto) {
+        String lockKey = com.zanxiang.game.back.base.ServerInfo.SERVER_NAME + ":TtAppOrderBack:" + dto.getGameId() + ":" + dto.getOrderId();
+        int maxCount = 0;
+        while (true) {
+            if (redisTemplate.opsForValue().get(lockKey) == null) {
+                break;
+            }
+            if (maxCount++ >= 120 / 10) {
+                break;
+            }
+            try {
+                Thread.sleep(10 * 1000L);
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
+            }
+        }
+        // 加锁最大等待 120s
+        // distributedLockComponent.doLock(lockKey, 60, 1L, TimeUnit.SECONDS);
+
+        return gameOceanengineAppOrderLogService.getOne(new LambdaQueryWrapper<GameOceanengineAppOrderLog>()
+                .eq(GameOceanengineAppOrderLog::getOrderNo, dto.getOrderId())
+                .eq(GameOceanengineAppOrderLog::getGameId, dto.getGameId())
+                .eq(GameOceanengineAppOrderLog::getAgentKey, dto.getAgentKey())
+                .eq(GameOceanengineAppOrderLog::getUserId, dto.getUserId())
+        );
+    }
 }