From bfdddc815801afd2636eef67eb9712fe4136ebde Mon Sep 17 00:00:00 2001 From: zhangshanxue Date: Tue, 22 Oct 2019 11:59:23 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=92=8C=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=8F=90=E7=A4=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ljsd/jieling/core/HandlerLogicThread.java | 43 +++++++--- .../ljsd/jieling/core/SimpleTransaction.java | 11 ++- .../com/ljsd/jieling/exception/ErrorCode.java | 60 +++++++++++++- .../jieling/exception/ErrorCodeException.java | 26 ++++++ .../com/ljsd/jieling/exception/ErrorUtil.java | 83 +++++++++++++++++++ .../ljsd/jieling/exception/IErrorCode.java | 15 ++++ .../logic/activity/ActivityTypeEnum.java | 19 +++-- .../src/main/java/config/SErrorCodeHint.java | 31 +++++++ 8 files changed, 269 insertions(+), 19 deletions(-) create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCodeException.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorUtil.java create mode 100644 serverlogic/src/main/java/com/ljsd/jieling/exception/IErrorCode.java create mode 100644 tablemanager/src/main/java/config/SErrorCodeHint.java diff --git a/serverlogic/src/main/java/com/ljsd/jieling/core/HandlerLogicThread.java b/serverlogic/src/main/java/com/ljsd/jieling/core/HandlerLogicThread.java index f6d4b7fb3..eaca43751 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/core/HandlerLogicThread.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/core/HandlerLogicThread.java @@ -2,6 +2,9 @@ package com.ljsd.jieling.core; import com.ljsd.GameApplication; import com.ljsd.jieling.db.mongo.MongoUtil; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.exception.ErrorUtil; import com.ljsd.jieling.handler.BaseHandler; import com.ljsd.jieling.logic.GlobalDataManaager; import com.ljsd.jieling.logic.OnlineUserManager; @@ -126,7 +129,7 @@ public class HandlerLogicThread extends Thread{ return; } session.setLastMsgId(msgId); - setTransaction(session); + SimpleTransaction transaction = setTransaction(session); BaseHandler baseHandler = ProtocolsManager.getInstance().getHandler(msgId); if(baseHandler == null){ LOGGER.info("request uid=>{} , msgId=>{}, not find the baseHandler",userId,msgId); @@ -137,33 +140,49 @@ public class HandlerLogicThread extends Thread{ if(!b){ MessageUtil.sendErrorResponse(session,0,msgId+1,"funciton not"); return; + // throw new ErrorCodeException(ErrorCode.newDefineCode("funciton not")); } b = checkIsPermit(msgId, session); if(!b){ MessageUtil.sendErrorResponse(session,0,msgId+1,"在地图探索中,不可以操作"); return; + // throw new ErrorCodeException(ErrorCode.newDefineCode("在地图探索中,不可以操作")); } } - long curTimeMillis = System.currentTimeMillis(); - if(msgId != MessageTypeProto.MessageType.GET_CHAT_MESSAGE_REQUEST_VALUE){ + + if (msgId != MessageTypeProto.MessageType.GET_CHAT_MESSAGE_REQUEST_VALUE) { LOGGER.info("doWork->uid={},mType={};start", userId, MessageTypeProto.MessageType.valueOf(msgId)); } - - MissionEventDistributor.requestStart(); + long curTimeMillis = System.nanoTime(); + transaction.beafore(); baseHandler.execute(session, packetNetData); - MissionEventDistributor.requestEnd(session,true); - current().commit(); - MongoUtil.getInstence().lastUpdate(); - if(msgId != MessageTypeProto.MessageType.GET_CHAT_MESSAGE_REQUEST_VALUE){ - long useTime = System.currentTimeMillis() - curTimeMillis; - LOGGER.info("doWork->uid={},mType={},useTime={},;end", userId, MessageTypeProto.MessageType.valueOf(msgId),useTime); + transaction.commit(); + if (msgId != MessageTypeProto.MessageType.GET_CHAT_MESSAGE_REQUEST_VALUE) { + long useTime = System.nanoTime() - curTimeMillis; + LOGGER.info("doWork->uid={},mType={},useTime={},;end", userId, MessageTypeProto.MessageType.valueOf(msgId), useTime); } - }catch (Exception e){ + } + catch (Exception e){ + SimpleTransaction transaction = current(); if(null!=transaction){ ISession session = transaction.getSession(); try { + + //内部codeErr统一处理 + if(e instanceof ErrorCodeException){ + int errCode = ErrorUtil.getExceptionErrorCodeValue(e); + if (errCode <= 0) { + //打印堆栈定位错误 + LOGGER.error(ErrorUtil.getExceptionStackTraceFileLineAndMethod(e)); + }else { + LOGGER.info(e.toString()); + } + MessageUtil.sendErrorResponse(session, errCode, session.getLastMsgId() + 1, ErrorUtil.getExceptionMessage(e)); + return; + } + current().callback(); LOGGER.error("\nuser:"+ session.getUid(),e); User user = UserManager.getUserInMem(session.getUid()); diff --git a/serverlogic/src/main/java/com/ljsd/jieling/core/SimpleTransaction.java b/serverlogic/src/main/java/com/ljsd/jieling/core/SimpleTransaction.java index 2bb5c9afe..ce1d25c82 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/core/SimpleTransaction.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/core/SimpleTransaction.java @@ -1,6 +1,8 @@ package com.ljsd.jieling.core; import com.google.protobuf.GeneratedMessage; +import com.ljsd.jieling.db.mongo.MongoUtil; +import com.ljsd.jieling.logic.mission.event.MissionEventDistributor; import com.ljsd.jieling.network.session.ISession; import com.ljsd.jieling.protocols.MessageTypeProto; import com.ljsd.jieling.protocols.PlayerInfoProto; @@ -67,13 +69,20 @@ public class SimpleTransaction { dealWhileCommit(transTask); } + public void beafore() throws Exception{ + MissionEventDistributor.requestStart(); + } - public void commit() { + public void commit() throws Exception{ doAddSendCache(); for (TransTask transTask : tasks) { if (!transTask.isCallback()) transTask.run(); } + //miss + MissionEventDistributor.requestEnd(session,true); + //mongo + MongoUtil.getInstence().lastUpdate(); } void callback() { diff --git a/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCode.java b/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCode.java index 719917d00..94895afdb 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCode.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCode.java @@ -1,6 +1,38 @@ package com.ljsd.jieling.exception; -public class ErrorCode { + +/** + * Description: + * a——游戏的弹出错误规范 + * b——错误堆栈抛出打印 + * 错误提示 前端读配置 后端文字仅做查找和日志用 + * 1: code>=0 客户端显示根据配置 服务器打印手动添加的描述(默认程序错误发送0 配置“服务器紧急修复中”文字 ) + * 2: code=-1 客户端显示服务器描述字段 服务器打印手动添加的描述(如道具不足 等级不够等逻辑上不应该出现的错误 用来定位错误) + * 3: code= -* 服务器推送 (系统错误 重复登陆 踢用户下线 账号级别的错误推送) + * + *

+ * 1 2级使用msgId+1响应 + * 3 走以前的推送 + *a + * Author: zsx + * CreateDate: 2019/10/21 11:23 + */ +public enum ErrorCode implements IErrorCode { + + + SYS_ERROR_CODE(-100, "系统错误"), + RELOGIN_CODE(-101, "重复登陆"), + KICK_USER_CODE(-102, "踢用户下线"), + + + SERVER_SELF_DEFINE(-1, "正在紧急修复中,请稍后再试"), + UNKNOWN(0, "正在紧急修复中,请稍后再试"), + NAME_USE(1,"该名字已被使用"), + NAME_LENTH(2,"名字长度为2-6个字"), + LOGIN_ERR(3,"登录密码错误"), + USE_NOT_EXIT(5,"该用户不存在"), + ITEM_POCKET_IS_FULL(6, "背包已满"), + ; //系统错误 public static final int sysErrorCode = -100; @@ -12,4 +44,30 @@ public class ErrorCode { public static final int kickUserCode = -102; + int codeId; + String errMsg; + + ErrorCode(int codeId, String errMsg) { + this.codeId = codeId; + this.errMsg = errMsg; + } + + @Override + public int code() { + return codeId; + } + + @Override + public String message() { + return errMsg; + } + + private ErrorCode reDefineMsg(String errMsg) { + this.errMsg = errMsg; + return this; + } + + public static ErrorCode newDefineCode(String errMsg) { + return SERVER_SELF_DEFINE.reDefineMsg(errMsg); + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCodeException.java b/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCodeException.java new file mode 100644 index 000000000..4bd606ad7 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorCodeException.java @@ -0,0 +1,26 @@ +package com.ljsd.jieling.exception; + +/** + * Description: 逻辑异常包装类 + * Author: zsx + * CreateDate: 2019/10/21 11:44 + */ +public class ErrorCodeException extends Exception { + public ErrorCodeException(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + private final ErrorCode errorCode; + + public ErrorCode getCode() { + return this.errorCode; + } + + public String toString() { + return "[CODE: " + this.errorCode.code() + "][" + this.errorCode.message() + "] " + super.getMessage(); + } + + public String getMessage() { + return "" + super.getMessage(); + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorUtil.java b/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorUtil.java new file mode 100644 index 000000000..ff6c7641f --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/exception/ErrorUtil.java @@ -0,0 +1,83 @@ +package com.ljsd.jieling.exception; + +/** + * Description: 异常工具类 + * Author: zsx + * CreateDate: 2019/10/21 11:23 + */ +public class ErrorUtil { + + public ErrorUtil() { + } + + private static ErrorCode getExceptionErrorCode(Throwable e) { + if (e == null) { + return ErrorCode.UNKNOWN; + } else { + Throwable t = e; + ErrorCode r = ErrorCode.UNKNOWN; + do { + if (t instanceof ErrorCodeException) { + r = ((ErrorCodeException) t).getCode(); + } + t = t.getCause(); + } while (t != null); + + return r; + } + } + + public static int getExceptionErrorCodeValue(Throwable e) { + return getExceptionErrorCode(e).code(); + } + + public static String getExceptionMessage(Throwable e) { + if (e == null) { + return ""; + } else { + StringBuilder builder = new StringBuilder(); + Throwable t = e; + do { + if (!(t instanceof ErrorCodeException)) { + builder.append(t.getClass().getSimpleName()).append(":").append(t.getMessage()).append(" "); + } else if (t.getMessage() != null && t.getMessage().length() > 0) { + builder.append(t.getMessage()).append(" "); + } + t = t.getCause(); + } while (t != null); + return builder.toString(); + } + } + + /** + * 服务器打印 + */ + public static String getExceptionStackTraceFileLineAndMethod(Throwable e) { + if (e == null) { + return ""; + } else { + StringBuilder builder = new StringBuilder(); + Throwable t = e; + + while (t != null) { + StackTraceElement[] stackTraceElements = t.getStackTrace(); + if (stackTraceElements != null && stackTraceElements.length > 0) { + builder.append(System.getProperty("line.separator")); + int var5 = stackTraceElements.length; + + for (StackTraceElement stackTraceElement : stackTraceElements) { + builder.append(" at ").append(stackTraceElement).append(System.getProperty("line.separator")); + } + } + + t = t.getCause(); + if (t != null) { + builder.append(t); + } + } + + return builder.toString(); + } + } + +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/exception/IErrorCode.java b/serverlogic/src/main/java/com/ljsd/jieling/exception/IErrorCode.java new file mode 100644 index 000000000..e4cef8c3e --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/exception/IErrorCode.java @@ -0,0 +1,15 @@ +package com.ljsd.jieling.exception; + + +/** + * Description: 错误提示 前端读配置 后端文字仅做显示用 + * Author: zsx + * CreateDate: 2019/10/21 11:10 + */ +public interface IErrorCode { + + int code(); + + String message(); + +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java index 4054f8cfc..8936384dd 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/ActivityTypeEnum.java @@ -39,6 +39,13 @@ public enum ActivityTypeEnum { private int type; private Function toActivityFunction; private static HashMap acticityCache = new HashMap<>(); + private static final HashMap activityEnumMap = new HashMap<>(); + + static { + for (ActivityTypeEnum item:ActivityTypeEnum.values()) { + activityEnumMap.put(item.getType(),item); + } + } ActivityTypeEnum(int type, Function toActivityFunction) { this.type = type; @@ -56,11 +63,13 @@ public enum ActivityTypeEnum { public static AbstractActivity getActicityType(int id) { SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(id); - for (ActivityTypeEnum activityType:ActivityTypeEnum.values()) { - if(activityType.getType()==sGlobalActivity.getType()){ - return activityType.toActivity(id); - } - } +// for (ActivityTypeEnum activityType:ActivityTypeEnum.values()) { +// if(activityType.getType()==sGlobalActivity.getType()){ +// return activityType.toActivity(id); +// } +// } + if (activityEnumMap.containsKey(sGlobalActivity.getType())) + return activityEnumMap.get(sGlobalActivity.getType()).toActivity(id); return null; } diff --git a/tablemanager/src/main/java/config/SErrorCodeHint.java b/tablemanager/src/main/java/config/SErrorCodeHint.java new file mode 100644 index 000000000..00401cc66 --- /dev/null +++ b/tablemanager/src/main/java/config/SErrorCodeHint.java @@ -0,0 +1,31 @@ +package config; + +import manager.STableManager; +import manager.Table; + +import java.util.Map; + +@Table(name ="ErrorCodeHint") +public class SErrorCodeHint implements BaseConfig { + + private int id; + + private int showType; + + + @Override + public void init() throws Exception { + + } + + + public int getId() { + return id; + } + + public int getShowType() { + return showType; + } + + +} \ No newline at end of file From c536c8c6a5860eeab63a7fb3117ef0a599e11525 Mon Sep 17 00:00:00 2001 From: wangyuan Date: Tue, 22 Oct 2019 14:06:50 +0800 Subject: [PATCH 2/2] fix adventure reward --- .../com/ljsd/jieling/handler/GameGM/GMRequestHandler.java | 1 + .../java/com/ljsd/jieling/logic/fight/CombatLogic.java | 8 -------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java b/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java index 2af1cdd94..df2d5eed4 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/handler/GameGM/GMRequestHandler.java @@ -141,6 +141,7 @@ public class GMRequestHandler extends BaseHandler{ break; } } + break; case GlobalGm.ADOPT_FIGHT_BY_VALUE: int fightId = cUser.getMainLevelManager().getFightId(); if(SMainLevelConfig.biggerThanFight(fightId,prarm1)){ diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/CombatLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/CombatLogic.java index 76ebfa3c0..2ffb3a43e 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/CombatLogic.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/fight/CombatLogic.java @@ -251,14 +251,6 @@ public class CombatLogic { } int fightId = mainLevelManager.getFightId(); SMainLevelConfig targetMainLevelConfig = SMainLevelConfig.config.get(fightId); - if(mainLevelManager.getState()==-1){ - for( SMainLevelConfig sMainLevelConfig : SMainLevelConfig.config.values() ){ - if(sMainLevelConfig.getNextLevel() == mainLevelManager.getFightId()){ - targetMainLevelConfig = sMainLevelConfig; - break; - } - } - } int lastTime = mainLevelManager.getLastTime(); int now = (int) (System.currentTimeMillis() / 1000); int times = (now - lastTime)/STableManager.getFigureConfig(CommonStaticConfig.class).getGameSetting().getAdventureRefresh();