Quartz 를 이용한 schedule job 처리
2024. 4. 8. 00:00ㆍASPNET/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 를 처리 해도 된다.
후자를 추천한다.
관련영상
반응형
'ASPNET > WebApi' 카테고리의 다른 글
MySql 에서 schedule 처리 하기 (0) | 2024.04.15 |
---|---|
ASPNET 6 Web Api Basic Tutorial 2 / 2 (Swagger, SeriLog, MediatR, EntityFrameworkCore, Scrutor) (0) | 2022.01.01 |
ASPNET 6 Web Api Basic Tutorial 1 / 2 (Swagger, SeriLog, MediatR, EntityFrameworkCore, Scrutor) (0) | 2022.01.01 |
Dotnet 6 Dependency Injection (0) | 2022.01.01 |