Bladeren bron

Fixing Server Startup

Fixed reserved words in aanouncements table.
Added more SLF4J logs.
Unhardcoded versions from pom.
Added server.log to log4j2.xml
Removed JDK4 log management.
Zoey76 6 jaren geleden
bovenliggende
commit
1dc5980007

+ 5 - 4
.gitignore

@@ -1,4 +1,5 @@
-.project
-.classpath
-.settings/
-target/
+/.project
+/.classpath
+/.settings/
+/target/
+/logs/

+ 11 - 5
pom.xml

@@ -11,6 +11,12 @@
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<slf4j.version>1.7.25</slf4j.version>
 		<log4j.version>2.11.1</log4j.version>
+		<InMemoryJavaCompiler.version>1.3.0</InMemoryJavaCompiler.version>
+		<gson.version>2.8.5</gson.version>
+		<weupnp.version>0.1.4</weupnp.version>
+		<!-- Test -->
+		<testng.version>6.14.3</testng.version>
+		<mockito-core.version>2.24.5</mockito-core.version>
 	</properties>
 	<dependencies>
 		<dependency>
@@ -31,17 +37,17 @@
 		<dependency>
 			<groupId>org.mdkt.compiler</groupId>
 			<artifactId>InMemoryJavaCompiler</artifactId>
-			<version>1.3.0</version>
+			<version>${InMemoryJavaCompiler.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>com.google.code.gson</groupId>
 			<artifactId>gson</artifactId>
-			<version>2.8.5</version>
+			<version>${gson.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>org.bitlet</groupId>
 			<artifactId>weupnp</artifactId>
-			<version>0.1.4</version>
+			<version>${weupnp.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>com.l2jserver</groupId>
@@ -59,13 +65,13 @@
 		<dependency>
 			<groupId>org.testng</groupId>
 			<artifactId>testng</artifactId>
-			<version>6.14.3</version>
+			<version>${testng.version}</version>
 			<scope>test</scope>
 		</dependency>
 		<dependency>
 			<groupId>org.mockito</groupId>
 			<artifactId>mockito-core</artifactId>
-			<version>2.24.5</version>
+			<version>${mockito-core.version}</version>
 			<scope>test</scope>
 		</dependency>
 	</dependencies>

+ 11 - 27
src/main/java/com/l2jserver/gameserver/GameServer.java

@@ -20,15 +20,12 @@ package com.l2jserver.gameserver;
 
 import java.awt.Toolkit;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.nio.file.Paths;
 import java.util.Calendar;
 import java.util.concurrent.TimeUnit;
-import java.util.logging.LogManager;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -148,20 +145,25 @@ import com.l2jserver.util.IPv4Filter;
 import com.l2jserver.util.Util;
 
 public final class GameServer {
+	
 	private static final Logger LOG = LoggerFactory.getLogger(GameServer.class);
-	private static final String LOG_FOLDER = "log"; // Name of folder for log file
-	private static final String LOG_NAME = "./log.cfg"; // Name of log file
+	
 	private static final String DATAPACK = "-dp";
+	
 	private static final String GEODATA = "-gd";
 	
 	private final SelectorThread<L2GameClient> _selectorThread;
+	
 	private final L2GamePacketHandler _gamePacketHandler;
+	
 	private final DeadLockDetector _deadDetectThread;
+	
 	public static GameServer gameServer;
+	
 	public static final Calendar dateTimeServerStarted = Calendar.getInstance();
 	
 	public GameServer() throws Exception {
-		long serverLoadStart = System.currentTimeMillis();
+		final var serverLoadStart = System.currentTimeMillis();
 		
 		LOG.info("{}: Used memory: {}MB.", getClass().getSimpleName(), getUsedMemoryMB());
 		
@@ -172,13 +174,9 @@ public final class GameServer {
 		
 		ThreadPoolManager.getInstance();
 		EventDispatcher.getInstance();
-		
-		new File("log/game").mkdirs();
-		
 		ScriptEngineManager.getInstance();
 		
 		printSection("World");
-		// start game time control early
 		GameTimeController.init();
 		InstanceManager.getInstance();
 		L2World.getInstance();
@@ -302,12 +300,11 @@ public final class GameServer {
 		FortManager.getInstance().activateInstances();
 		FortSiegeManager.getInstance();
 		SiegeScheduleData.getInstance();
-		
 		MerchantPriceConfigTable.getInstance().updateReferences();
 		TerritoryWarManager.getInstance();
 		CastleManorManager.getInstance();
 		MercTicketManager.getInstance();
-		
+		printSection("Quests");
 		QuestManager.getInstance().report();
 		
 		if (Config.SAVE_DROPPED_ITEM) {
@@ -319,13 +316,10 @@ public final class GameServer {
 		}
 		
 		MonsterRace.getInstance();
-		
 		SevenSigns.getInstance().spawnSevenSignsNPC();
 		SevenSignsFestival.getInstance();
 		AutoSpawnHandler.getInstance();
-		
 		FaenorScriptEngine.getInstance();
-		// Init of a cursed weapon manager
 		
 		LOG.info("AutoSpawnHandler: Loaded {} handlers in total.", AutoSpawnHandler.getInstance().size());
 		
@@ -410,7 +404,6 @@ public final class GameServer {
 	public static void main(String[] args) throws Exception {
 		Server.serverMode = Server.MODE_GAMESERVER;
 		
-		// Initialize configurations.
 		Config.load();
 		
 		final String dp = Util.parseArg(args, DATAPACK, true);
@@ -423,18 +416,7 @@ public final class GameServer {
 			Config.GEODATA_PATH = Paths.get(gd);
 		}
 		
-		// Create log folder
-		File logFolder = new File(Config.DATAPACK_ROOT, LOG_FOLDER);
-		logFolder.mkdir();
-		
-		// Create input stream for log file -- or store file data into memory
-		try (InputStream is = new FileInputStream(new File(LOG_NAME))) {
-			LogManager.getLogManager().readConfiguration(is);
-		}
-		
 		printSection("Database");
-		DAOFactory.getInstance();
-		
 		ConnectionFactory.builder() //
 			.withDriver(Config.DATABASE_DRIVER) //
 			.withUrl(Config.DATABASE_URL) //
@@ -445,6 +427,8 @@ public final class GameServer {
 			.withMaxPoolSize(Config.DATABASE_MAX_CONNECTIONS) //
 			.build();
 		
+		DAOFactory.getInstance();
+		
 		gameServer = new GameServer();
 		
 		if (Config.IS_TELNET_ENABLED) {

+ 1 - 1
src/main/java/com/l2jserver/gameserver/data/sql/impl/AnnouncementsTable.java

@@ -52,7 +52,7 @@ public final class AnnouncementsTable {
 		_announcements.clear();
 		try (var con = ConnectionFactory.getInstance().getConnection();
 			var st = con.createStatement();
-			var rs = st.executeQuery("SELECT id, type, initial, delay, repeat, author, content FROM announcements")) {
+			var rs = st.executeQuery("SELECT `id`, `type`, `initial`, `delay`, `repeat`, `author`, `content` FROM announcements")) {
 			while (rs.next()) {
 				final AnnouncementType type = AnnouncementType.findById(rs.getInt("type"));
 				final var author = rs.getString("author");

+ 18 - 10
src/main/java/com/l2jserver/gameserver/idfactory/BitSetIDFactory.java

@@ -21,16 +21,24 @@ package com.l2jserver.gameserver.idfactory;
 import java.util.BitSet;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.util.PrimeFinder;
 
 /**
- * This class ..
- * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
+ * BitSet ID Factory.
+ * @version 2.6.1.0
  */
 public class BitSetIDFactory extends IdFactory {
+	
+	private static final Logger LOG = LoggerFactory.getLogger(BitSetIDFactory.class);
+	
 	private BitSet _freeIds;
+	
 	private AtomicInteger _freeIdCount;
+	
 	private AtomicInteger _nextFreeId;
 	
 	protected class BitSetCapacityCheck implements Runnable {
@@ -51,7 +59,7 @@ public class BitSetIDFactory extends IdFactory {
 			ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new BitSetCapacityCheck(), 30000, 30000);
 			initialize();
 		}
-		_log.info(getClass().getSimpleName() + ": " + _freeIds.size() + " id's available.");
+		LOG.info("{} Ids available.", _freeIds.size());
 	}
 	
 	public void initialize() {
@@ -63,7 +71,7 @@ public class BitSetIDFactory extends IdFactory {
 			for (int usedObjectId : extractUsedObjectIDTable()) {
 				int objectID = usedObjectId - FIRST_OID;
 				if (objectID < 0) {
-					_log.warning(getClass().getSimpleName() + ": Object ID " + usedObjectId + " in DB is less than minimum ID of " + FIRST_OID);
+					LOG.warn("Object Id {} in DB is less than minimum ID of {}!", usedObjectId, FIRST_OID);
 					continue;
 				}
 				_freeIds.set(usedObjectId - FIRST_OID);
@@ -72,19 +80,19 @@ public class BitSetIDFactory extends IdFactory {
 			
 			_nextFreeId = new AtomicInteger(_freeIds.nextClearBit(0));
 			_initialized = true;
-		} catch (Exception e) {
+		} catch (Exception ex) {
 			_initialized = false;
-			_log.severe(getClass().getSimpleName() + ": Could not be initialized properly: " + e.getMessage());
+			LOG.error("Could not be initialized properly!", ex);
 		}
 	}
 	
 	@Override
-	public synchronized void releaseId(int objectID) {
-		if ((objectID - FIRST_OID) > -1) {
-			_freeIds.clear(objectID - FIRST_OID);
+	public synchronized void releaseId(int objectId) {
+		if ((objectId - FIRST_OID) > -1) {
+			_freeIds.clear(objectId - FIRST_OID);
 			_freeIdCount.incrementAndGet();
 		} else {
-			_log.warning(getClass().getSimpleName() + ": Release objectID " + objectID + " failed (< " + FIRST_OID + ")");
+			LOG.warn("Release objectID {} failed (< {}).", objectId, FIRST_OID);
 		}
 	}
 	

+ 10 - 5
src/main/java/com/l2jserver/gameserver/idfactory/CompactionIDFactory.java

@@ -21,6 +21,9 @@ package com.l2jserver.gameserver.idfactory;
 import java.sql.Connection;
 import java.sql.SQLException;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.l2jserver.commons.database.ConnectionFactory;
 import com.l2jserver.gameserver.config.Config;
 
@@ -30,6 +33,8 @@ import com.l2jserver.gameserver.config.Config;
 @Deprecated
 public class CompactionIDFactory extends IdFactory {
 	
+	private static final Logger LOG = LoggerFactory.getLogger(CompactionIDFactory.class);
+	
 	private int _curOID;
 	
 	private final int _freeSize;
@@ -47,10 +52,10 @@ public class CompactionIDFactory extends IdFactory {
 				N = insertUntil(tmp_obj_ids, idx, N, con);
 			}
 			_curOID++;
-			_log.info(getClass().getSimpleName() + ": Next usable Object ID is: " + _curOID);
+			LOG.info("Next usable Object Id is {}.", _curOID);
 			_initialized = true;
-		} catch (Exception e) {
-			_log.severe(getClass().getSimpleName() + ": Could not initialize properly: " + e.getMessage());
+		} catch (Exception ex) {
+			LOG.error("Could not initialize properly!", ex);
 		}
 	}
 	
@@ -69,7 +74,7 @@ public class CompactionIDFactory extends IdFactory {
 					try (var rs = ps.executeQuery()) {
 						while (rs.next()) {
 							int badId = rs.getInt(1);
-							_log.severe(getClass().getSimpleName() + ": Bad ID " + badId + " in DB found by: " + check);
+							LOG.error("Bad Id {} in DB found by {}!", badId, check);
 							throw new RuntimeException();
 						}
 					}
@@ -83,7 +88,7 @@ public class CompactionIDFactory extends IdFactory {
 		}
 		for (int i = 1; i <= hole; i++) {
 			id = tmp_obj_ids[N - i];
-			_log.info(getClass().getSimpleName() + ": Compacting DB object ID=" + id + " into " + (_curOID));
+			LOG.info("Compacting DB object Id={} into {}.", id, _curOID);
 			for (String update : ID_UPDATES) {
 				try (var ps = con.prepareStatement(update)) {
 					ps.setInt(1, _curOID);

+ 16 - 26
src/main/java/com/l2jserver/gameserver/idfactory/IdFactory.java

@@ -21,19 +21,20 @@ package com.l2jserver.gameserver.idfactory;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.l2jserver.commons.database.ConnectionFactory;
 import com.l2jserver.gameserver.config.Config;
 
 /**
- * This class ...
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * Id Factory.
+ * @version 2.6.1.0
  */
 public abstract class IdFactory {
 	
-	protected static final Logger _log = Logger.getLogger(IdFactory.class.getName());
+	private static final Logger LOG = LoggerFactory.getLogger(IdFactory.class);
 	
 	@Deprecated
 	protected static final String[] ID_UPDATES = {
@@ -156,22 +157,16 @@ public abstract class IdFactory {
 		}
 	}
 	
-	/**
-	 * Sets all character offline
-	 */
 	private void setAllCharacterOffline() {
 		try (var con = ConnectionFactory.getInstance().getConnection();
 			var s = con.createStatement()) {
 			s.executeUpdate("UPDATE characters SET online = 0");
-			_log.info("Updated characters online status.");
-		} catch (Exception e) {
-			_log.log(Level.WARNING, "Could not update characters online status: " + e.getMessage(), e);
+			LOG.info("Updated characters online status.");
+		} catch (Exception ex) {
+			LOG.warn("Could not update characters online status!", ex);
 		}
 	}
 	
-	/**
-	 * Cleans up Database
-	 */
 	private void cleanUpDB() {
 		try (var con = ConnectionFactory.getInstance().getConnection();
 			var stmt = con.createStatement()) {
@@ -276,9 +271,9 @@ public abstract class IdFactory {
 			stmt.executeUpdate("UPDATE clanhall SET ownerId=0, paidUntil=0, paid=0 WHERE clanhall.ownerId NOT IN (SELECT clan_id FROM clan_data);");
 			stmt.executeUpdate("UPDATE fort SET owner=0 WHERE owner NOT IN (SELECT clan_id FROM clan_data);");
 			
-			_log.info("Cleaned " + cleanCount + " elements from database in " + ((System.currentTimeMillis() - cleanupStart) / 1000) + " s");
-		} catch (Exception e) {
-			_log.log(Level.WARNING, "Could not clean up database: " + e.getMessage(), e);
+			LOG.info("Cleaned {} elements from database in {} s.", cleanCount, (System.currentTimeMillis() - cleanupStart) / 1000);
+		} catch (Exception ex) {
+			LOG.warn("Could not clean up database!", ex);
 		}
 	}
 	
@@ -287,9 +282,9 @@ public abstract class IdFactory {
 			var s = con.createStatement()) {
 			s.executeUpdate("DELETE FROM mods_wedding WHERE player1Id NOT IN (SELECT charId FROM characters)");
 			s.executeUpdate("DELETE FROM mods_wedding WHERE player2Id NOT IN (SELECT charId FROM characters)");
-			_log.info("Cleaned up invalid Weddings.");
-		} catch (Exception e) {
-			_log.log(Level.WARNING, "Could not clean up invalid Weddings: " + e.getMessage(), e);
+			LOG.info("Cleaned up invalid weddings.");
+		} catch (Exception ex) {
+			LOG.warn("Could not clean up invalid weddings!", ex);
 		}
 	}
 	
@@ -302,16 +297,11 @@ public abstract class IdFactory {
 					cleanCount += stmt.executeUpdate();
 				}
 			}
-			_log.info("Cleaned " + cleanCount + " expired timestamps from database.");
+			LOG.info("Cleaned {} expired timestamps from database.", cleanCount);
 		} catch (Exception e) {
 		}
 	}
 	
-	/**
-	 * @return
-	 * @throws Exception
-	 * @throws SQLException
-	 */
 	protected final Integer[] extractUsedObjectIDTable() throws Exception {
 		final List<Integer> temp = new ArrayList<>();
 		try (var con = ConnectionFactory.getInstance().getConnection();

+ 12 - 9
src/main/java/com/l2jserver/gameserver/idfactory/StackIDFactory.java

@@ -22,15 +22,20 @@ import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.Stack;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.l2jserver.commons.database.ConnectionFactory;
 import com.l2jserver.gameserver.config.Config;
 
 /**
- * This class ...
- * @version $Revision: 1.3.2.1.2.7 $ $Date: 2005/04/11 10:06:12 $
+ * Stack ID Factory.
+ * @version 2.6.1.0
  */
 public class StackIDFactory extends IdFactory {
 	
+	private static final Logger LOG = LoggerFactory.getLogger(IdFactory.class);
+	
 	private int _curOID;
 	
 	private int _tempOID;
@@ -43,13 +48,11 @@ public class StackIDFactory extends IdFactory {
 		_tempOID = FIRST_OID;
 		
 		try (var con = ConnectionFactory.getInstance().getConnection()) {
-			// con.createStatement().execute("drop table if exists tmp_obj_id");
-			
 			Integer[] tmp_obj_ids = extractUsedObjectIDTable();
 			if (tmp_obj_ids.length > 0) {
 				_curOID = tmp_obj_ids[tmp_obj_ids.length - 1];
 			}
-			_log.info("Max Id = " + _curOID);
+			LOG.info("Max Id = {}.", _curOID);
 			
 			int N = tmp_obj_ids.length;
 			for (int idx = 0; idx < N; idx++) {
@@ -57,10 +60,10 @@ public class StackIDFactory extends IdFactory {
 			}
 			
 			_curOID++;
-			_log.info("IdFactory: Next usable Object ID is: " + _curOID);
+			LOG.info("Next usable Object Id is {}.", _curOID);
 			_initialized = true;
-		} catch (Exception e) {
-			_log.severe(getClass().getSimpleName() + ": Could not be initialized properly:" + e.getMessage());
+		} catch (Exception ex) {
+			LOG.error("Could not be initialized properly!", ex);
 		}
 	}
 	
@@ -80,7 +83,7 @@ public class StackIDFactory extends IdFactory {
 					try (var rs = ps.executeQuery()) {
 						while (rs.next()) {
 							int badId = rs.getInt(1);
-							_log.severe("Bad ID " + badId + " in DB found by: " + check);
+							LOG.error("Bad Id {} in DB found by {}!", badId, check);
 							throw new RuntimeException();
 						}
 					}

+ 10 - 13
src/main/java/com/l2jserver/gameserver/instancemanager/GlobalVariablesManager.java

@@ -19,8 +19,9 @@
 package com.l2jserver.gameserver.instancemanager;
 
 import java.util.Map.Entry;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.l2jserver.commons.database.ConnectionFactory;
 import com.l2jserver.gameserver.model.variables.AbstractVariables;
@@ -31,7 +32,7 @@ import com.l2jserver.gameserver.model.variables.AbstractVariables;
  */
 public final class GlobalVariablesManager extends AbstractVariables {
 	
-	private static final Logger _log = Logger.getLogger(GlobalVariablesManager.class.getName());
+	private static final Logger LOG = LoggerFactory.getLogger(GlobalVariablesManager.class);
 	
 	private static final String SELECT_QUERY = "SELECT * FROM global_variables";
 	
@@ -52,13 +53,13 @@ public final class GlobalVariablesManager extends AbstractVariables {
 			while (rset.next()) {
 				set(rset.getString("var"), rset.getString("value"));
 			}
-		} catch (Exception e) {
-			_log.log(Level.WARNING, getClass().getSimpleName() + ": Couldn't restore global variables");
+		} catch (Exception ex) {
+			LOG.warn("Couldn't restore global variables!", ex);
 			return false;
 		} finally {
 			compareAndSetChanges(true, false);
 		}
-		_log.log(Level.INFO, getClass().getSimpleName() + ": Loaded " + getSet().size() + " variables.");
+		LOG.info("Loaded {} variables.", getSet().size());
 		return true;
 	}
 	
@@ -82,20 +83,16 @@ public final class GlobalVariablesManager extends AbstractVariables {
 				st.addBatch();
 			}
 			st.executeBatch();
-		} catch (Exception e) {
-			_log.log(Level.WARNING, getClass().getSimpleName() + ": Couldn't save global variables to database.", e);
+		} catch (Exception ex) {
+			LOG.warn("Couldn't save global variables to database!", ex);
 			return false;
 		} finally {
 			compareAndSetChanges(true, false);
 		}
-		_log.log(Level.INFO, getClass().getSimpleName() + ": Stored " + getSet().size() + " variables.");
+		LOG.info("Stored {} variables.", getSet().size());
 		return true;
 	}
 	
-	/**
-	 * Gets the single instance of {@code GlobalVariablesManager}.
-	 * @return single instance of {@code GlobalVariablesManager}
-	 */
 	public static final GlobalVariablesManager getInstance() {
 		return SingletonHolder._instance;
 	}

+ 2 - 2
src/main/resources/config/Server.properties

@@ -51,8 +51,8 @@ Database = MySQL
 # Driver = org.hsqldb.jdbcDriver
 # Driver = com.microsoft.sqlserver.jdbc.SQLServerDriver
 # Driver = org.mariadb.jdbc.Driver
-# Default: com.mysql.jdbc.Driver
-Driver = com.mysql.jdbc.Driver
+# Default: com.mysql.cj.jdbc.Driver
+Driver = com.mysql.cj.jdbc.Driver
 # Database URL
 # URL = jdbc:mysql://localhost/l2jgs?useSSL=false&serverTimezone=UTC
 # URL = jdbc:hsqldb:hsql://localhost/l2jgs

+ 8 - 4
src/main/resources/log4j2.xml

@@ -1,13 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Configuration status="INFO">
 	<Appenders>
-		<Console name="console" target="SYSTEM_OUT">
+		<Console name="Console" target="SYSTEM_OUT">
 			<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c{1}: %msg%n" />
 		</Console>
+		<File name="ServerFile" fileName="logs/server.log">
+			<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss} %c{1}: %msg%n" />
+		</File>
 	</Appenders>
 	<Loggers>
-		<Root level="info" additivity="false">
-			<AppenderRef ref="console" />
+		<Root level="debug">
+			<appender-ref ref="Console" level="info" />
+			<appender-ref ref="ServerFile" level="info" />
 		</Root>
 	</Loggers>
-</Configuration>
+</Configuration>