| 
					
				 | 
			
			
				@@ -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()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |