Quartz Scheduler (.Net) - 1

restful api를 만드는데 특정 시간에 뭔가를 해줘야 하는 경우가 생겼다.

예를들면 오늘 서비스가 expired가 되서 status를 false로 바꿔야되는경우.

매 12시마다 오늘의 매출을 보는것… 등등 특정 시간에 웹사이트에 버튼을 눌러줘야하는경우 가 있는데

보통 이런것들은 다들 코딩을 어떻게 하는지 모르겟다.

내가 생각해볼수 있는 방법은

  1. crontab 으로 shell을 돌린다.
  2. 웹사이트에 기능을 만들어 두고 특정 시간에 누른다.
  3. url을 특정 시간에 ie를 실행시켜 호출하도록 bat 파일을 만들고 윈도우 스케줄러를 이용하여 실행한다.

위 방법들이 지금까지 내가 본 것들이다. 다들 장단점이 있다…

처리해야할 일이 얼마나 많은가에 따라 달라질듯도 싶다.

하나의 방법을 더 추가하려고 한다. 유명한 Quartz 스케줄러를 사용하는 것이다.

각자 자기에게 맞는 방법을 사용하자.

quartz-scheduler 가 뭔지 확인해보자. Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system.

그런데 난 .net을 사용한다…닷넷용을 찾아보자.

quartz

이걸 사용하여 visual studio를 통해 webapi에서 구현해보려고 한다.

특정 시간 (밤 12시)에 오늘 가입한 모든 사람에게 이메일을 보내는 걸 구현해보자.

Quartz.NET is a full-featured, open source job scheduling system that can be used from smallest apps to large scale enterprise systems.

이해가 잘 되는듯 하다.

web api 프로젝트에서 누겟을 이용하여 설치하자.

프로젝트를 연다.

패키지 매니져에서 nuget을 설치하던지 다음 커맨드를 실행한다.

Install-Package Quartz -Version 2.4.0

설치가 완료 됫다.

이제 클래스를 추가하자. 아무데나 추가해도 되지만 난 scheduler 라는 폴더를 프로젝트에 추가한후 거기에 클래스를 추가한다.


public class EmailJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        using (var message = new MailMessage("from@gmail.com", "to@gmail.com"))
        {
            message.Subject = "Test";
            message.Body = "Test at " + DateTime.Now;
            using (SmtpClient client = new SmtpClient
            {
                EnableSsl = true,
                Host = "smtp.gmail.com",
                Port = 587,
                Credentials = new NetworkCredential("from@gmail.com", "yourpassword")
            })
            {
                client.Send(message);
            }
        }
    }
}

중요한건 :IJob 을 구현해야한다는 것이다.

이제 job이 구현이 됬다.

트리커를 구현해보자. 같은 폴더에 아래 클래스도 구현하자.

public class JobScheduler
{
    public static void Start()
    {
        IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
        scheduler.Start();

        IJobDetail job = JobBuilder.Create<EmailJob>().Build();

        ITrigger trigger = TriggerBuilder.Create()
             .StartNow()
             .WithSimpleSchedule(x => x
                .WithIntervalInMinutes(5) // 5분 간격으로 계속 실행해라.
                .RepeatForever())
             .Build();

        scheduler.ScheduleJob(job, trigger);
    }
} 

트리거 등록이 되었다. 이제 프로그램을 실행시켜 줘야하는데 …Global.asx가 제일 좋은 위치같다. 다음을 추가하자.

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        JobScheduler.Start();
    }
}

이제 웹서버에 디플로이 하거나 f5를 눌러서 실행시킨다.

5분마다 한번씩 이메일이 날라옴을 확인할수 있다.

참고사항

VS를 실행해두고 잇으면 이메일이 아무것도 안오는경우가 있다. 이건 iis가 요청을 처음 처리할때 메모리에 로딩을 하면서 생기는 문제 같다.

쉽게말해 VS를 실행하면 global.asx가 실행되는게 아니라 요청이 하나라도 있어야 Global.asx가 실행된다는 이야기

그러므로 VS를 실행하고 나서 아무런 요청을 테스트 서버에 날려줘야한다.

Get이나 Post나 아무거나 상관없다. 일단한번 리퀘스트하고 나면 약 5분간격으로 이메일이 오는것을 확인할수 있다.

다음 번에는 트리거를 작성하지않고 xml로 처리하는 방법을 이야기해보려고 한다.

  • 참고 사이트

http://www.mikesdotnetting.com/article/254/scheduled-tasks-in-asp-net-with-quartz-net

teamsmiley's profile image

teamsmiley

2016-08-22 00:00

Read more posts by this author