세션 관리용 스케줄러 추가

This commit is contained in:
김민서 2024-04-04 14:19:23 +09:00
parent 86aa5c663b
commit ec53ec0b50
4 changed files with 35 additions and 53 deletions

View File

@ -1,3 +1,4 @@
using Server.Scheduler;
using Server.System; using Server.System;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@ -8,6 +9,9 @@ ProtocolProcessor.Init();
//깃 웹훅 초기화 //깃 웹훅 초기화
GItWebhook.Init(); GItWebhook.Init();
//스케줄러 초기화
Statics.session.Start();
//http용 데이터 //http용 데이터
app.MapPost("/", ProtocolProcessor.Process); app.MapPost("/", ProtocolProcessor.Process);

View File

@ -5,32 +5,18 @@ namespace Server.Scheduler
{ {
public class SessionScheduler : System.Scheduler public class SessionScheduler : System.Scheduler
{ {
System.Redis redis;
NLog.ILogger logger = LogManager.GetCurrentClassLogger();
public SessionScheduler(string cronData, Redis redis) : base(cronData)
{
this.redis = redis;
}
public override void Process() public override void Process()
{ {
List<LoginUser> users = redis.GetList<LoginUser>("LoginUser"); List<LoginUser> users = Statics.redis.GetList<LoginUser>("LoginUser");
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
Console.WriteLine($"SessionScheduler : {now.ToString()}");
//logger.Debug($"SessionScheduler : {now.ToString()}");
for (int n = users.Count - 1; n >= 0; n--) for (int n = users.Count - 1; n >= 0; n--)
{ {
if ((now - users[n].moveTime).TotalMinutes >= 1) //1분이상 지난상태 if ((now - users[n].moveTime).TotalMinutes >= 10)
{ {
redis.RemoveList(n, users[n], "LoginUser"); Statics.redis.RemoveList(n, users[n], "LoginUser");
redis.RemoveKey("UserSession", users[n].UUID); Statics.redis.RemoveKey("UserSession", users[n].UUID);
} }
} }
} }

View File

@ -1,4 +1,5 @@
using Server.SQL; using Server.Scheduler;
using Server.SQL;
using Server.SQL.Excel; using Server.SQL.Excel;
namespace Server.System namespace Server.System
@ -41,5 +42,8 @@ namespace Server.System
public static ShopItemDataExcel shopItemExcel = new ShopItemDataExcel(); public static ShopItemDataExcel shopItemExcel = new ShopItemDataExcel();
public static ConsumableItemDataExcel consumableItemExcel = new ConsumableItemDataExcel(); public static ConsumableItemDataExcel consumableItemExcel = new ConsumableItemDataExcel();
public static ResetShopItemDataExcel resetShopItemExcel = new ResetShopItemDataExcel(); public static ResetShopItemDataExcel resetShopItemExcel = new ResetShopItemDataExcel();
//
public static Schedule<SessionScheduler> session = new Schedule<SessionScheduler>("sessionJob", "sessionGroup", "Session", "0/5 * * * * ?");
} }
} }

View File

@ -6,61 +6,49 @@ namespace Server.System
public abstract class Scheduler : IJob public abstract class Scheduler : IJob
{ {
private string _cron;
public string cron { get { return _cron; } }
public Scheduler(string cronData)
{
_cron = cronData;
}
public abstract void Process(); public abstract void Process();
public async Task Execute(IJobExecutionContext context) public async Task Execute(IJobExecutionContext context)
{ {
Console.WriteLine("Job 실행됨: " + DateTime.Now);
Process(); Process();
await Task.CompletedTask;
} }
} }
public class schedule public class Schedule<T> where T : Scheduler
{ {
private StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
private IScheduler scheduler; private IScheduler scheduler;
private List<Scheduler> schedules = new List<Scheduler>();
public void Add(Scheduler scheduler) private string jobName;
private string group;
private string triggerName;
private string cron;
public Schedule(string jobName, string group, string triggerName, string cron)
{ {
schedules.Add(scheduler); this.jobName = jobName;
this.group = group;
this.triggerName = triggerName;
this.cron = cron;
} }
public async Task Start() public async Task Start()
{ {
Console.WriteLine("scheduler: " + schedules.Count); scheduler = await schedulerFactory.GetScheduler();
// 스케줄러 생성
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = await schedulerFactory.GetScheduler();
// 스케줄러 시작
await scheduler.Start(); await scheduler.Start();
// schedules에 있는 스케줄들을 스케줄러에 등록 IJobDetail job = JobBuilder.Create<T>()
foreach (var schedule in schedules) .WithIdentity(jobName, group)
{
IJobDetail job = JobBuilder.Create<Scheduler>()
.WithIdentity(schedule.GetType().Name, "group" + schedule.GetType().Name) // Scheduler 클래스의 이름을 사용하여 고유한 ID 생성
.Build(); .Build();
ITrigger trigger = TriggerBuilder.Create() ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(schedule.GetType().Name + "Trigger", "group" + schedule.GetType().Name) .WithIdentity(triggerName, group)
.WithCronSchedule(schedule.cron) // 스케줄의 cron 표현식 사용 .StartNow()
.WithCronSchedule(cron)
.Build(); .Build();
await scheduler.ScheduleJob(job, trigger); await scheduler.ScheduleJob(job, trigger);
} }
// 프로그램이 종료되지 않도록 대기
await Task.Delay(TimeSpan.FromDays(365));
}
public async Task Stop() public async Task Stop()
{ {
// 스케줄러 중지 // 스케줄러 중지