mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-12 09:30:19 -07:00
Large improvements to server stability
This commit is contained in:
parent
88cca3dea8
commit
d618239e0a
9 changed files with 67 additions and 86 deletions
|
|
@ -1,54 +1,33 @@
|
||||||
package core.game.system.task;
|
package core.game.system.task
|
||||||
|
|
||||||
import java.util.concurrent.Executors;
|
import kotlinx.coroutines.GlobalScope
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class holding methods to execute tasks.
|
* A class holding methods to execute tasks.
|
||||||
* @author Emperor
|
* @author Emperor
|
||||||
*/
|
*/
|
||||||
public final class TaskExecutor {
|
object TaskExecutor {
|
||||||
|
|
||||||
/**
|
|
||||||
* The executor to use.
|
|
||||||
*/
|
|
||||||
private static final ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The SQL task executor.
|
|
||||||
*/
|
|
||||||
private static final ScheduledExecutorService SQL_EXECUTOR = Executors.newSingleThreadScheduledExecutor();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a new {@code TaskExecutor} {@code Object}.
|
|
||||||
*/
|
|
||||||
private TaskExecutor() {
|
|
||||||
/*
|
|
||||||
* empty.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes an SQL handling task.
|
* Executes an SQL handling task.
|
||||||
* @param task The task.
|
* @param task The task.
|
||||||
*/
|
*/
|
||||||
public static void executeSQL(Runnable task) {
|
@JvmStatic
|
||||||
SQL_EXECUTOR.execute(task);
|
fun executeSQL(task: () -> Unit) {
|
||||||
|
GlobalScope.launch {
|
||||||
|
task.invoke()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the task.
|
* Executes the task.
|
||||||
* @param task The task to execute.
|
* @param task The task to execute.
|
||||||
*/
|
*/
|
||||||
public static void execute(Runnable task) {
|
@JvmStatic
|
||||||
EXECUTOR.execute(task);
|
fun execute(task: () -> Unit) {
|
||||||
|
GlobalScope.launch {
|
||||||
|
task.invoke()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the executor.
|
|
||||||
* @return The executor.
|
|
||||||
*/
|
|
||||||
public static ScheduledExecutorService getExecutor() {
|
|
||||||
return EXECUTOR;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -10,6 +10,7 @@ import core.gui.ConsoleFrame;
|
||||||
import core.gui.ConsoleTab;
|
import core.gui.ConsoleTab;
|
||||||
import core.tools.PlayerLoader;
|
import core.tools.PlayerLoader;
|
||||||
import core.tools.StringUtils;
|
import core.tools.StringUtils;
|
||||||
|
import kotlin.Unit;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import javax.swing.border.EtchedBorder;
|
import javax.swing.border.EtchedBorder;
|
||||||
|
|
@ -417,6 +418,7 @@ public final class UtilityTab extends ConsoleTab {
|
||||||
populating = true;
|
populating = true;
|
||||||
players.clear();
|
players.clear();
|
||||||
TaskExecutor.execute(() -> {
|
TaskExecutor.execute(() -> {
|
||||||
|
Thread.currentThread().setName("Utility Tab");
|
||||||
ConsoleFrame.getInstance().getPlayerTab().getPlayerNames().clear();
|
ConsoleFrame.getInstance().getPlayerTab().getPlayerNames().clear();
|
||||||
ConsoleFrame.getInstance().getPlayerTab().populatePlayerSearch();
|
ConsoleFrame.getInstance().getPlayerTab().populatePlayerSearch();
|
||||||
for (String name : ConsoleFrame.getInstance().getPlayerTab().getPlayerNames()) {
|
for (String name : ConsoleFrame.getInstance().getPlayerTab().getPlayerNames()) {
|
||||||
|
|
@ -435,6 +437,7 @@ public final class UtilityTab extends ConsoleTab {
|
||||||
populating = false;
|
populating = false;
|
||||||
System.gc();
|
System.gc();
|
||||||
lblPlayersLoaded.setText("Players loaded: " + players.size());
|
lblPlayersLoaded.setText("Players loaded: " + players.size());
|
||||||
|
return Unit.INSTANCE;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import core.net.EventProducer;
|
||||||
import core.net.IoSession;
|
import core.net.IoSession;
|
||||||
import core.net.NioReactor;
|
import core.net.NioReactor;
|
||||||
import core.net.producer.MSHSEventProducer;
|
import core.net.producer.MSHSEventProducer;
|
||||||
|
import kotlin.Unit;
|
||||||
import rs09.game.node.entity.player.info.login.LoginParser;
|
import rs09.game.node.entity.player.info.login.LoginParser;
|
||||||
import rs09.game.system.SystemLogger;
|
import rs09.game.system.SystemLogger;
|
||||||
import rs09.game.world.GameWorld;
|
import rs09.game.world.GameWorld;
|
||||||
|
|
@ -76,15 +77,13 @@ public final class WorldCommunicator {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
loginAttempts.put(parser.getDetails().getUsername(), parser);
|
loginAttempts.put(parser.getDetails().getUsername(), parser);
|
||||||
TaskExecutor.executeSQL(new Runnable() {
|
TaskExecutor.executeSQL(() -> {
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (!parser.getDetails().parse()) {
|
if (!parser.getDetails().parse()) {
|
||||||
parser.getDetails().getSession().write(Response.INVALID_LOGIN_SERVER, true);
|
parser.getDetails().getSession().write(Response.INVALID_LOGIN_SERVER, true);
|
||||||
return;
|
return Unit.INSTANCE;
|
||||||
}
|
}
|
||||||
MSPacketRepository.sendPlayerRegistry(parser);
|
MSPacketRepository.sendPlayerRegistry(parser);
|
||||||
}
|
return Unit.INSTANCE;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import core.game.system.mysql.SQLManager;
|
||||||
import core.game.system.task.TaskExecutor;
|
import core.game.system.task.TaskExecutor;
|
||||||
import core.net.Constants;
|
import core.net.Constants;
|
||||||
import core.net.IoSession;
|
import core.net.IoSession;
|
||||||
|
import kotlin.Unit;
|
||||||
import rs09.ServerConstants;
|
import rs09.ServerConstants;
|
||||||
import rs09.game.system.SystemLogger;
|
import rs09.game.system.SystemLogger;
|
||||||
import rs09.game.world.GameWorld;
|
import rs09.game.world.GameWorld;
|
||||||
|
|
@ -76,19 +77,17 @@ public class AccountRegister extends SQLEntryHandler<RegistryDetails> {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
System.out.println(username);
|
System.out.println(username);
|
||||||
TaskExecutor.executeSQL(new Runnable() {
|
TaskExecutor.executeSQL(() -> {
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
try {
|
||||||
if (PlayerSQLManager.hasSqlAccount(username, "username")) {
|
if (PlayerSQLManager.hasSqlAccount(username, "username")) {
|
||||||
response(session, RegistryResponse.NOT_AVAILBLE_USER);
|
response(session, RegistryResponse.NOT_AVAILBLE_USER);
|
||||||
return;
|
return Unit.INSTANCE;
|
||||||
}
|
}
|
||||||
response(session, RegistryResponse.SUCCESS);
|
response(session, RegistryResponse.SUCCESS);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
return Unit.INSTANCE;
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 36://Register details
|
case 36://Register details
|
||||||
|
|
@ -129,13 +128,11 @@ public class AccountRegister extends SQLEntryHandler<RegistryDetails> {
|
||||||
buffer.getInt();
|
buffer.getInt();
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
final RegistryDetails details = new RegistryDetails(name, SystemManager.getEncryption().hashPassword(password), new Date(year, month, day), country);
|
final RegistryDetails details = new RegistryDetails(name, SystemManager.getEncryption().hashPassword(password), new Date(year, month, day), country);
|
||||||
TaskExecutor.execute(new Runnable() {
|
TaskExecutor.execute(() -> {
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
try {
|
||||||
if (PlayerSQLManager.hasSqlAccount(name, "username")) {
|
if (PlayerSQLManager.hasSqlAccount(name, "username")) {
|
||||||
response(session, RegistryResponse.CANNOT_CREATE);
|
response(session, RegistryResponse.CANNOT_CREATE);
|
||||||
return;
|
return Unit.INSTANCE;
|
||||||
}
|
}
|
||||||
SQLEntryHandler.write(new AccountRegister(details));
|
SQLEntryHandler.write(new AccountRegister(details));
|
||||||
response(session, RegistryResponse.SUCCESS);
|
response(session, RegistryResponse.SUCCESS);
|
||||||
|
|
@ -143,7 +140,7 @@ public class AccountRegister extends SQLEntryHandler<RegistryDetails> {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
response(session, RegistryResponse.CANNOT_CREATE);
|
response(session, RegistryResponse.CANNOT_CREATE);
|
||||||
}
|
}
|
||||||
}
|
return Unit.INSTANCE;
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -340,7 +340,7 @@ class ScriptAPI(private val bot: Player) {
|
||||||
*/
|
*/
|
||||||
fun walkTo(loc: Location){
|
fun walkTo(loc: Location){
|
||||||
if(!bot.walkingQueue.isMoving) {
|
if(!bot.walkingQueue.isMoving) {
|
||||||
Executors.newSingleThreadExecutor().execute {
|
GlobalScope.launch {
|
||||||
walkToIterator(loc)
|
walkToIterator(loc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -645,7 +645,7 @@ class ScriptAPI(private val bot: Player) {
|
||||||
* @return true if item was successfully bought, false if not.
|
* @return true if item was successfully bought, false if not.
|
||||||
*/
|
*/
|
||||||
fun buyFromGE(bot: Player, itemID: Int, amount: Int){
|
fun buyFromGE(bot: Player, itemID: Int, amount: Int){
|
||||||
Executors.newSingleThreadExecutor().execute{
|
GlobalScope.launch {
|
||||||
val offer = GrandExchangeOffer()
|
val offer = GrandExchangeOffer()
|
||||||
offer.itemID = itemID
|
offer.itemID = itemID
|
||||||
offer.sell = false
|
offer.sell = false
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,7 @@ class CombatStateIntermediate(val bot: PestControlTestBot2) {
|
||||||
fun randomWalkTo(loc: Location, radius: Int) {
|
fun randomWalkTo(loc: Location, radius: Int) {
|
||||||
if(!bot.walkingQueue.isMoving) {
|
if(!bot.walkingQueue.isMoving) {
|
||||||
Executors.newSingleThreadExecutor().execute {
|
Executors.newSingleThreadExecutor().execute {
|
||||||
|
Thread.currentThread().name = "RandomWalkToIteratorBot"
|
||||||
var newloc = loc.transform(RandomFunction.random(radius, -radius),
|
var newloc = loc.transform(RandomFunction.random(radius, -radius),
|
||||||
RandomFunction.random(radius, -radius), 0)
|
RandomFunction.random(radius, -radius), 0)
|
||||||
walkToIterator(newloc)
|
walkToIterator(newloc)
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ object ImmerseWorld {
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun init() {
|
fun init() {
|
||||||
Executors.newSingleThreadExecutor().execute {
|
Executors.newSingleThreadExecutor().execute {
|
||||||
|
Thread.currentThread().name = "BotSpawner"
|
||||||
immerseSeersAndCatherby()
|
immerseSeersAndCatherby()
|
||||||
immerseLumbridgeDraynor()
|
immerseLumbridgeDraynor()
|
||||||
immerseVarrock()
|
immerseVarrock()
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,6 @@ package rs09.game.world.repository
|
||||||
|
|
||||||
import core.game.node.entity.player.Player
|
import core.game.node.entity.player.Player
|
||||||
import core.game.node.entity.player.info.login.PlayerParser
|
import core.game.node.entity.player.info.login.PlayerParser
|
||||||
import core.game.system.mysql.SQLEntryHandler
|
|
||||||
import core.game.system.mysql.impl.HighscoreSQLHandler
|
|
||||||
import core.game.system.mysql.impl.PlayerLogSQLHandler
|
|
||||||
import core.game.system.task.TaskExecutor
|
import core.game.system.task.TaskExecutor
|
||||||
import rs09.game.system.SystemLogger
|
import rs09.game.system.SystemLogger
|
||||||
import rs09.game.world.GameWorld
|
import rs09.game.world.GameWorld
|
||||||
|
|
@ -71,7 +68,10 @@ class DisconnectionQueue {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if (!force) {
|
if (!force) {
|
||||||
TaskExecutor.executeSQL { save(player, true) }
|
TaskExecutor.executeSQL {
|
||||||
|
Thread.currentThread().name = "PlayerSave SQL"
|
||||||
|
save(player, true)
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
save(player, false)
|
save(player, false)
|
||||||
|
|
|
||||||
|
|
@ -103,21 +103,22 @@ class LoginReadEvent
|
||||||
session.isaacPair = ISAACPair(inCipher, outCipher)
|
session.isaacPair = ISAACPair(inCipher, outCipher)
|
||||||
session.clientInfo = ClientInfo(displayMode, windowMode, screenWidth, screenHeight)
|
session.clientInfo = ClientInfo(displayMode, windowMode, screenWidth, screenHeight)
|
||||||
val b = buffer
|
val b = buffer
|
||||||
TaskExecutor.executeSQL(Runnable {
|
TaskExecutor.executeSQL {
|
||||||
|
Thread.currentThread().name = "Login Password Response"
|
||||||
try {
|
try {
|
||||||
val username = StringUtils.longToString(b.long)
|
val username = StringUtils.longToString(b.long)
|
||||||
val password = ByteBufferUtils.getString(b)
|
val password = ByteBufferUtils.getString(b)
|
||||||
val response = PlayerSQLManager.getCredentialResponse(username, password)
|
val response = PlayerSQLManager.getCredentialResponse(username, password)
|
||||||
if (response != Response.SUCCESSFUL) {
|
if (response != Response.SUCCESSFUL) {
|
||||||
session.write(response, true)
|
session.write(response, true)
|
||||||
return@Runnable
|
return@executeSQL
|
||||||
}
|
}
|
||||||
login(PlayerDetails(username, password), session, b, opcode)
|
login(PlayerDetails(username, password), session, b, opcode)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
session.write(Response.COULD_NOT_LOGIN)
|
session.write(Response.COULD_NOT_LOGIN)
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -138,7 +139,7 @@ class LoginReadEvent
|
||||||
if (WorldCommunicator.isEnabled()) {
|
if (WorldCommunicator.isEnabled()) {
|
||||||
WorldCommunicator.register(parser)
|
WorldCommunicator.register(parser)
|
||||||
} else {
|
} else {
|
||||||
TaskExecutor.executeSQL(parser)
|
TaskExecutor.executeSQL {parser.run()}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue