package server;
import constants.ServerConstants;
import database.DatabaseConnection;
import handling.cashshop.CashShopServer;
import handling.channel.ChannelServer;
import handling.farm.FarmServer;
import handling.login.LoginServer;
import handling.world.World;
import java.sql.SQLException;
import server.Timer.BuffTimer;
import server.Timer.CloneTimer;
import server.Timer.EtcTimer;
import server.Timer.EventTimer;
import server.Timer.MapTimer;
import server.Timer.PingTimer;
import server.Timer.WorldTimer;
import tools.packet.CWvsContext;
public class ShutdownServer implements ShutdownServerMBean {
public static ShutdownServer instance = new ShutdownServer();
public static ShutdownServer getInstance() {
return instance;
}
@Override
public void shutdown() {//can execute twice
run();
}
@Override
public void run() {
int ret = 0;
World.Broadcast.broadcastMessage(CWvsContext.broadcastMsg(0, "伺服器將進行停機維護, 請安全的下線, 以免造成不必要的損失。"));
for (ChannelServer cs : ChannelServer.getAllInstances()) {
cs.setShutdown();
cs.setServerMessage("伺服器將進行停機維護, 請安全的下線, 以免造成不必要的損失。");
ret += cs.closeAllMerchant();
}
/*AtomicInteger FinishedThreads = new AtomicInteger(0);
HiredMerchantSave.Execute(this);
synchronized (this) {
try {
wait();
} catch (InterruptedException ex) {
Logger.getLogger(ShutdownServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
while (FinishedThreads.incrementAndGet() != HiredMerchantSave.NumSavingThreads) {
synchronized (this) {
try {
wait();
} catch (InterruptedException ex) {
Logger.getLogger(ShutdownServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}*/
World.Guild.save();
World.Alliance.save();
World.Family.save();
System.out.println("數據存檔完成,僱傭商人儲存個數: " + ret);
try {
World.Broadcast.broadcastMessage(CWvsContext.broadcastMsg(0, "伺服器將進行停機維護, 請安全的下線, 以免造成不必要的損失。"));
Integer[] chs = ChannelServer.getAllInstance().toArray(new Integer[0]);
for (int i : chs) {
try {
ChannelServer cs = ChannelServer.getInstance(i);
synchronized (this) {
cs.shutdown();
}
} catch (Exception e) {
}
}
CashShopServer.shutdown();
DatabaseConnection.closeAll();
} catch (SQLException e) {
System.err.println("THROW" + e);
}
WorldTimer.getInstance().stop();
EtcTimer.getInstance().stop();
MapTimer.getInstance().stop();
CloneTimer.getInstance().stop();
EventTimer.getInstance().stop();
BuffTimer.getInstance().stop();
PingTimer.getInstance().stop();
for (ChannelServer ch : ChannelServer.getAllInstances()) {
ch.shutdown();
}
CashShopServer.shutdown();
if (ServerConstants.MAPLE_TYPE == ServerConstants.MapleType.GLOBAL) {
FarmServer.shutdown();
}
LoginServer.shutdown();
System.out.println("關閉伺服器完成\r\n");
}
}