diff --git a/Server/Scheduler/SessionScheduler.cs b/Server/Scheduler/SessionScheduler.cs index 3e8a0bb..ac3e43c 100644 --- a/Server/Scheduler/SessionScheduler.cs +++ b/Server/Scheduler/SessionScheduler.cs @@ -1,18 +1,45 @@ -using Server.System; +using NLog; +using Server.System; namespace Server.Scheduler { public class SessionScheduler : System.Scheduler { - System.Redis redis = new Redis(); - public SessionScheduler(string cronData) : base(cronData) + System.Redis redis; + + NLog.ILogger logger = LogManager.GetCurrentClassLogger(); + + public SessionScheduler(string cronData, Redis redis) : base(cronData) { + this.redis = redis; } public override void Process() { - //모든 유저해쉬를 받아오는 함수가 필요 아니 모든 접속유저를 List형태로 따로 저장해두기. - //redis.GetHash() + List users = redis.GetList("LoginUser"); + + DateTime now = DateTime.Now; + + Console.WriteLine($"SessionScheduler : {now.ToString()}"); + + //logger.Debug($"SessionScheduler : {now.ToString()}"); + + + for (int n = users.Count - 1; n >= 0; n--) + { + if ((now - users[n].moveTime).TotalMinutes >= 1) //1분이상 지난상태 + { + redis.RemoveList(n, users[n], "LoginUser"); + redis.RemoveKey("UserSession", users[n].UUID); + } + } } + + public class LoginUser + { + public string UUID; + public DateTime moveTime; + } + } } diff --git a/Server/System/Redis.cs b/Server/System/Redis.cs index e0990ec..fa50f1d 100644 --- a/Server/System/Redis.cs +++ b/Server/System/Redis.cs @@ -240,6 +240,19 @@ namespace Server.System return db.HashGet(KeySet(keys), field); } + public void RemoveKey(params string[] keys) + { + if (local) + { + stringType.Remove(KeySet(keys)); + listType.Remove(KeySet(keys)); + zType.Remove(KeySet(keys)); + hashType.Remove(KeySet(keys)); + } + else + db.KeyDelete(KeySet(keys)); + } + private string KeySet(string[] keys) { return string.Join(":", keys); diff --git a/Server/System/Statics.cs b/Server/System/Statics.cs index 371e366..9f5c00c 100644 --- a/Server/System/Statics.cs +++ b/Server/System/Statics.cs @@ -14,7 +14,7 @@ namespace Server.System public static readonly string EXCEL_SQL_URL = "Host=192.168.0.2;Port=5432;Username=manager;Password=Zn2zs558W5SdD8K;Database=project_thewar;"; public static readonly string remoteUrl = "https://manager:BQNl01bJJF0wn9R@gitea.pandoli365.com/Team.thewar/thewar_excel_live.git"; #endif - + public static readonly Redis redis = new Redis("172.16.18.244", 48600); public static readonly string URL = "https://0.0.0.0:4860"; diff --git a/Server/System/schedule.cs b/Server/System/schedule.cs index a6848e9..ac4a2b3 100644 --- a/Server/System/schedule.cs +++ b/Server/System/schedule.cs @@ -35,9 +35,10 @@ namespace Server.System public async Task Start() { + Console.WriteLine("scheduler: " + schedules.Count); // 스케줄러 생성 ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); - scheduler = await schedulerFactory.GetScheduler(); + IScheduler scheduler = await schedulerFactory.GetScheduler(); // 스케줄러 시작 await scheduler.Start(); @@ -46,11 +47,11 @@ namespace Server.System foreach (var schedule in schedules) { IJobDetail job = JobBuilder.Create() - .WithIdentity(schedule.GetType().Name, "group1") // Scheduler 클래스의 이름을 사용하여 고유한 ID 생성 + .WithIdentity(schedule.GetType().Name, "group" + schedule.GetType().Name) // Scheduler 클래스의 이름을 사용하여 고유한 ID 생성 .Build(); ITrigger trigger = TriggerBuilder.Create() - .WithIdentity(schedule.GetType().Name + "Trigger", "group1") + .WithIdentity(schedule.GetType().Name + "Trigger", "group" + schedule.GetType().Name) .WithCronSchedule(schedule.cron) // 스케줄의 cron 표현식 사용 .Build();