59 lines
1.8 KiB
C#
59 lines
1.8 KiB
C#
using Google.Protobuf;
|
|
using Google.Protobuf.WellKnownTypes;
|
|
|
|
|
|
using ServerCore;
|
|
using ServerBase;
|
|
using ServerCommon;
|
|
using ServerCommon.BusinessLogDomain;
|
|
using MetaAssets;
|
|
|
|
using ControlCenter.NamedPipe;
|
|
using ServerControlCenter;
|
|
|
|
|
|
namespace GameServer.Monitor.PacketHandler;
|
|
|
|
public class ForceStopServerMessageReceiver : NamedPipeReceiver<A2S_REQ_FORCE_STOP_SERVER>
|
|
{
|
|
public ForceStopServerMessageReceiver() { }
|
|
|
|
public override async Task Handle(A2S_REQ_FORCE_STOP_SERVER message, string message_id)
|
|
{
|
|
Log.getLogger().debug($"{nameof(ForceStopServerMessageReceiver)}: Receive - message_id[{message_id}] / message[{message}]");
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
var proud_net_listener = server_logic.getProudNetListener();
|
|
await proud_net_listener.onLogoutUserAllByKick();
|
|
await NamedPipeMonitor.ChangeServerStatus(ServerStatus.ReserveToStop);
|
|
|
|
var timer = new PeriodicTimer(TimeSpan.FromMilliseconds(1_000));
|
|
while (true)
|
|
{
|
|
await timer.WaitForNextTickAsync();
|
|
var can_stop = CheckServerStatusForStopAsync();
|
|
if (can_stop)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
timer.Dispose();
|
|
|
|
// process 종료
|
|
await server_logic.onStopServer();
|
|
Environment.Exit(0);
|
|
}
|
|
|
|
private bool CheckServerStatusForStopAsync()
|
|
{
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
var proud_net_listener = GameServerApp.getServerLogic().getProudNetListener();
|
|
var check_count = proud_net_listener.getEntityWithSessions().Count;
|
|
Log.getLogger().debug($"server_name:[{server_logic.getServerName()}] / check_count: [{check_count}]");
|
|
|
|
//조건 1. 현재 Client Session 수 체크
|
|
return check_count <= 0;
|
|
|
|
}
|
|
} |