diff --git a/conf/c_database_version.json b/conf/c_database_version.json new file mode 100644 index 000000000..2b4b31e47 --- /dev/null +++ b/conf/c_database_version.json @@ -0,0 +1,4 @@ +{ + "version":"5", + "tables":"" +} \ No newline at end of file diff --git a/conf/hotfix.json b/conf/hotfix.json new file mode 100644 index 000000000..5ae757c8d --- /dev/null +++ b/conf/hotfix.json @@ -0,0 +1,5 @@ +{ + "version":"5", + "classes":[ + ] +} diff --git a/conf/hotswap/readme.txt b/conf/hotswap/readme.txt new file mode 100644 index 000000000..23e48c75d --- /dev/null +++ b/conf/hotswap/readme.txt @@ -0,0 +1,2 @@ +========hotfix========= +热更新class目录 \ No newline at end of file diff --git a/serverlogic/src/main/java/com/ljsd/jieling/hotfix/CDataBaseVersion.java b/serverlogic/src/main/java/com/ljsd/jieling/hotfix/CDataBaseVersion.java new file mode 100644 index 000000000..3c0dd245d --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/hotfix/CDataBaseVersion.java @@ -0,0 +1,24 @@ +package com.ljsd.jieling.hotfix; + +public class CDataBaseVersion { + + + private int version; + private String tables; + + public CDataBaseVersion(int version) { + this.version = version; + this.tables = ""; + } + + public CDataBaseVersion() { + } + + public int getVersion() { + return version; + } + + public String getTables() { + return tables; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/STableManager.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/STableManager.java index a76ae81fc..fb9326e38 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/logic/STableManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/STableManager.java @@ -1,15 +1,15 @@ package com.ljsd.jieling.logic; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.ljsd.jieling.hotfix.CDataBaseVersion; import com.ljsd.jieling.util.StringUtil; import com.ljsd.jieling.util.SysUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; +import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.*; @@ -22,26 +22,32 @@ public class STableManager { */ private static String data_parackage = null; + private static String jsonPath; + + private static int currentDbVersion; + public static void initialize(String data_parackage) throws Exception { STableManager.data_parackage = data_parackage; - updateTablesWithTableNames(null); + updateTablesWithTableNames(false); + initJsonPath(); + initDbVersion(); } /** * 根据表名字更新表数据 * - * @param hotfixTableStr * @throws Exception */ - public static void updateTablesWithTableNames(String hotfixTableStr) throws Exception { - + public static void updateTablesWithTableNames(boolean isHotFix) throws Exception { String[] tableList = null; - if (hotfixTableStr == null || hotfixTableStr.isEmpty()) { // 启动而不是热更 - // 加载全部 - tableList = null; - } else { + if (isHotFix) { + CDataBaseVersion version = getJsonFilePathInJsonConf("c_database_version.json",CDataBaseVersion.class); + if (version == null || version.getTables().isEmpty() || version.getVersion() == currentDbVersion) { // 启动而不是热更 + return; + } + currentDbVersion = version.getVersion(); //更新指定表 - tableList = hotfixTableStr.split("\\|"); + tableList = version.getTables().split("\\|"); } Set> messageCommandClasses = ClassScanner.listClassesWithAnnotation(data_parackage, Table.class); for (Class cls : messageCommandClasses) { @@ -278,4 +284,39 @@ public class STableManager { } + + public static T getJsonFilePathInJsonConf(String fileName, Class fileClass) { + File file = new File(jsonPath + fileName); + if (!file.exists()) { + LOGGER.info("the {} is not exist",fileName); + return null; + } + try (InputStream in = new FileInputStream(file);) { + ObjectMapper mapper = new ObjectMapper(); + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + return mapper.readValue(in, fileClass); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + private static void initJsonPath() { + String osName = System.getProperty("os.name"); + jsonPath = "../conf/"; + if (osName.matches("^(?i)Windows.*$")) {// Window 系统 + jsonPath = "conf/"; + } + } + + private static void initDbVersion() { + CDataBaseVersion cDataBaseVersion = getJsonFilePathInJsonConf("c_database_version.json",CDataBaseVersion.class); + if (null == cDataBaseVersion) { + currentDbVersion = 0; + } else { + currentDbVersion = cDataBaseVersion.getVersion(); + } + } } diff --git a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java index 2cdc7931a..0bdb14fe8 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/thread/task/MinuteTask.java @@ -3,11 +3,13 @@ package com.ljsd.jieling.thread.task; import com.ljsd.jieling.config.reportData.DataMessageUtils; import com.ljsd.jieling.core.GlobalsDef; import com.ljsd.jieling.handler.map.MapLogic; +import com.ljsd.jieling.hotfix.HotfixUtil; import com.ljsd.jieling.ktbeans.BeanBuilder.KtBeanBuilderUtils; import com.ljsd.jieling.ktbeans.KTAppOnline; import com.ljsd.jieling.ktbeans.parmsBean.ParamEventBean; import com.ljsd.jieling.logic.GlobalDataManaager; import com.ljsd.jieling.logic.OnlineUserManager; +import com.ljsd.jieling.logic.STableManager; import com.ljsd.jieling.logic.activity.ActivityLogic; import com.ljsd.jieling.logic.arena.ArenaLogic; import com.ljsd.jieling.logic.fight.CombatLogic; @@ -31,7 +33,9 @@ public class MinuteTask extends Thread { public void run() { try { LOGGER.info("MinuteTask start..."); + HotfixUtil.getInstance().doWork("../conf/hotfix.json"); ActivityLogic.getInstance().checkActiviyStatus(); + STableManager.updateTablesWithTableNames(true); ActivityLogic.getInstance().checkSecretBoxSeason(); MapLogic.getInstance().minuteCheckAndRemoveMapRank(); GlobalDataManaager.getInstance().checkSystemFunctioIsOpen();