package server;
import database.DatabaseConnection;
import handling.cashshop.CashShopServer;
import handling.channel.ChannelServer;
import handling.login.LoginServer;
import handling.world.WorldBroadcastService;
import handling.world.WorldGuildService;
import java.lang.management.ManagementFactory;
import java.sql.SQLException;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import org.apache.log4j.Logger;
import tools.FileoutputUtil;
import tools.MaplePacketCreator;
public class ShutdownServer implements ShutdownServerMBean {
private static final Logger log = Logger.getLogger(ShutdownServer.class);
public static ShutdownServer instance;
public int mode = 0;
public static void registerMBean() {
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
try {
instance = new ShutdownServer();
mBeanServer.registerMBean(instance, new ObjectName("server:type=ShutdownServer"));
} catch (MalformedObjectNameException | InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException e) {
FileoutputUtil.log("Error registering Shutdown MBean");
}
}
public static ShutdownServer getInstance() {
return instance;
}
@Override
public void shutdown() {
run();
}
@Override
public void run() {
if (this.mode == 0) {
WorldBroadcastService.getInstance().broadcastMessage(MaplePacketCreator.serverMessageNotice(" 游戏服务器将关闭维护,请玩家安全下线..."));
for (ChannelServer cs : ChannelServer.getAllInstances()) {
cs.setShutdown();
cs.closeAllMerchants();
}
WorldGuildService.getInstance().save();
FileoutputUtil.log("所有档案已保存.");
this.mode++;
} else if (this.mode == 1) {
this.mode++;
WorldBroadcastService.getInstance().broadcastMessage(MaplePacketCreator.serverMessageNotice(" 游戏服务器将关闭维护,请玩家安全下线..."));
Integer[] chs = (Integer[]) ChannelServer.getAllInstance().toArray(new Integer[0]);
for (int i = 0; i < chs.length; i++) {
i = chs[i];
try {
ChannelServer cs = ChannelServer.getInstance(i);
synchronized (this) {
cs.shutdown();
}
} catch (Exception e) {
log.error("关闭服务端错误 - 3" + e);
}
}
LoginServer.shutdown();
CashShopServer.shutdown();
//AuctionServer.shutdown(); //已注释启动拍卖
FileoutputUtil.log("正在关闭时钟线程...");
Timer.WorldTimer.getInstance().stop();
Timer.MapTimer.getInstance().stop();
Timer.BuffTimer.getInstance().stop();
Timer.CloneTimer.getInstance().stop();
Timer.CheatTimer.getInstance().stop();
Timer.EventTimer.getInstance().stop();
Timer.EtcTimer.getInstance().stop();
Timer.PingTimer.getInstance().stop();
FileoutputUtil.log("正在关闭数据库连接...");
try {
DatabaseConnection.closeAll();
} catch (SQLException e) {
log.error("关闭数据库连接错误" + e);
}
}
FileoutputUtil.log("游戏服务已成功关闭");
System.exit(0);
}
}