Quartz 를 이용한 schedule job 처리

2024. 4. 8. 00:00ASPNET/WebApi

반응형

프로그래밍을 하다보면 일정시간에 정기적으로 실행되야 하는 process 가 존재한다. 

이런 process 를 처리할때 여러가지 방법이 있다. 

 

1. OS 에 특정 기능(scheduler, crontab 등등)을 이용한다. 

2. language 의 도움을 받아 timer 로 구현한다. 

3. 3rd  party library 의 도움을 받는다.

 

오늘은 이 세가지 중에 3 번을 이용해 보려고 한다. 

Quartz.net 이라고 dotnet 용 scheduler library(framework) 이다. 

 

 

우선 web api 의 간단한 project 를 만들고 project folder 로 이동하자

Quartz 를 설치하자

dotnet add package quartz.aspnetcore

 

user 를 생성하는 api 가 존재 했으니

해당 api 를 10초 간격으로 호출 하도록 해보자

 

먼저  job 을 하나 만들자

[DisallowConcurrentExecution] // job 실행중에 schedule delay 가 되어 동시에 실행되지 않도록 방지
public class InsertUserJob(IMessageBus bus) : IJob
{
    private readonly IMessageBus _bus = bus;

    public async Task Execute(IJobExecutionContext context)
    {
        var id  = Guid.NewGuid().ToString();

        var rng = System.Security.Cryptography.RandomNumberGenerator.Create();
        byte[] intByte = new byte[4];
        rng.GetBytes(intByte);
        int age = Math.Abs(BitConverter.ToInt32(intByte, 0));
       
        var command = new Add.Command
        {
             Name = id,
             Email = $"{id}@email.net",
             Age = age

        };
        var response = await _bus.InvokeAsync<Add.Response>(command);
        Console.WriteLine(response.Result);
        Console.WriteLine(response.Error?.Message);

    }
}

 

이제 이 job 을 실행하기 위한 Quartz config 을 설정하자

 

Program.cs

builder.Services.AddQuartz(q =>
{
    q.SchedulerId = "Quartz-Scheduler-Core";
    q.UseMicrosoftDependencyInjectionJobFactory();
    q.UseSimpleTypeLoader();
    q.UseInMemoryStore();
    q.UseDefaultThreadPool(p =>
    {
        p.MaxConcurrency = 10;
    });

    #region Insert User
    var jobKey = new JobKey("InsertUser", nameof(InsertUserJob));
    q.AddJob<InsertUserJob>(jobKey);

    q.AddTrigger(
     cfg => cfg.ForJob(jobKey)
    .WithIdentity("InsertUser-Trigger")
    .WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10)).RepeatForever())
    );
    #endregion 

});

builder.Services.AddQuartzHostedService(options =>
{
    options.WaitForJobsToComplete = true;
});

위와 같이 하면 10초에 한번씩 우리가 만든 job 을 실행하게 될것이다. 

 

우리가 만든 job 은 그안에서 직접 무언가를 처리해도 되고

 

command 를 호출해서 이미 만들어 놓은 다른 process 를 처리 해도 된다. 

 

후자를 추천한다.

 

관련영상

https://youtu.be/Po88w7jQ6WQ

반응형