From 3f28e276fcfa70e285ad97f178caf33ccd550c62 Mon Sep 17 00:00:00 2001 From: lvxinran Date: Tue, 10 Aug 2021 10:28:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=8C=E9=87=8D=E6=A0=A1=E9=AA=8C=E6=B3=A8?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ljsd/controller/GetUserController.java | 53 +++++++++++-------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/ljsd/controller/GetUserController.java b/src/main/java/com/ljsd/controller/GetUserController.java index ccb2569..aa45865 100644 --- a/src/main/java/com/ljsd/controller/GetUserController.java +++ b/src/main/java/com/ljsd/controller/GetUserController.java @@ -13,7 +13,8 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.*; +import java.io.IOException; +import java.io.PrintWriter; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -151,32 +152,38 @@ public class GetUserController extends HttpServlet { int uid = 0; //加分布式锁 List userInfos = BaseGlobal.getInstance().mongoDBPool.find(_COLLECTION_NAME, dbObject); - try{ + if (userInfos.size() == 0) { + try{ boolean getLock=false; - while(!getLock){ - getLock = BaseGlobal.getInstance().redisApp.tryGetDistributedLock(RedisKey.REGISTER_LOCK, "", "get", 800); - if (getLock&&userInfos.size() == 0) { - DBObject next = server_info.iterator().next(); - Object register_state = next.get("register_state"); - if(register_state!=null&& register_state.equals("0")){ - returnErrorToFront(res,response,"该服务器已停止注册,请选择其他服务器游戏"); - return; + while(!getLock){ + getLock = BaseGlobal.getInstance().redisApp.tryGetDistributedLock(RedisKey.REGISTER_LOCK, "", "get", 800); + if(getLock){ + userInfos = BaseGlobal.getInstance().mongoDBPool.find(_COLLECTION_NAME, dbObject); + //双重校验 + if (userInfos.size() == 0) { + DBObject next = server_info.iterator().next(); + Object register_state = next.get("register_state"); + if(register_state!=null&& register_state.equals("0")){ + returnErrorToFront(res,response,"该服务器已停止注册,请选择其他服务器游戏"); + return; + } + uid = BaseGlobal.getInstance().mongoDBPool.inc("uid") + 10000000; + dbObject.put("uid", uid); + dbObject.put("_id", uid); + userInfos.add(dbObject); + if (gid != null && !gid.isEmpty()) { + dbObject.put("gid", gid); + } + if (pid != null && !pid.isEmpty()) { + dbObject.put("pid", pid); + } + BaseGlobal.getInstance().mongoDBPool.save(_COLLECTION_NAME, dbObject); + } } - uid = BaseGlobal.getInstance().mongoDBPool.inc("uid") + 10000000; - dbObject.put("uid", uid); - dbObject.put("_id", uid); - userInfos.add(dbObject); - if (gid != null && !gid.isEmpty()) { - dbObject.put("gid", gid); - } - if (pid != null && !pid.isEmpty()) { - dbObject.put("pid", pid); - } - BaseGlobal.getInstance().mongoDBPool.save(_COLLECTION_NAME, dbObject); } + }finally { + BaseGlobal.getInstance().redisApp.releaseDistributedLock(RedisKey.REGISTER_LOCK,"","get"); } - }finally { - BaseGlobal.getInstance().redisApp.releaseDistributedLock(RedisKey.REGISTER_LOCK,"","get"); } Random random = new Random(); int utoken = Math.abs(random.nextInt());