Quartz Scheduler (.Net) - 2 Xml Scheduler Setting

Xml Scheduler Setting

[지난글]에서 스케줄러를 c# 코드로 추가해 보았다.
이번에는 xml로 스케줄러를 세팅을 해보자.

web-api 기본 프로젝트를 만든다.

Install-Package Quartz -Version 2.4.0

자동으로 관련 dll과 job_scheduling_data_2_0.xsd 를 프로젝트 디렉토리에 추가한다.

먼저 Global.asax 수정해보자. Application_Start 에 다음을 추가한다.

protected void Application_Start()
{
     var scheduler = new StdSchedulerFactory().GetScheduler();
     scheduler.Start();
}

web.config에 처럼 추가하자.

<configSections>
    <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</configSections>

<quartz>
    <add key="quartz.scheduler.instanceName" value="DefaultQuartzScheduler"/>
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
    <add key="quartz.threadPool.threadCount" value="10"/>
    <add key="quartz.threadPool.threadPriority" value="2"/>
    <add key="quartz.jobStore.misfireThreshold" value="60000"/>
    <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/>
    <add key="quartz.plugin.xml.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz"/>
    <add key="quartz.plugin.xml.fileNames" value="~/quartz_jobs.xml" />
  </quartz>

이코드는 quartz 을 다운받으면 있는 샘플 코드를 참고 햇다. https://sourceforge.net/projects/quartznet/files/quartznet/

2.4.1을 받아서 압축을 풀어보면 샘플 코드가 있다. 거기에서 참고함.

한번 해보실때 version이 내가 사용한것과 다를수 있으니 꼭 샘플을 다운받아서 위 내용을 비교하면서 추가하시기 바랍니다.

중요한 부분은 quartz.plugin.xml.type 과 quartz.plugin.xml.fileNames 부분이다. 자바 버젼이나 에전 버전 샘플이 인터넷에 많아서 삽질을 많이 했음

꼭 이걸 사용하시기 바랍니다.

이제 중요한 작업을 하는 클래스를 만들어 보자.

네임 스페이스는 알아서 정하고 클래스는 다음을 이용한다.


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);
            }
        }
    }
}

간단히 이메일 보내는 클래스이다.

이제 스케줄러를 이용해서 이걸 5분마다 실행하게 만들어야한다.

위에서 설정한 xml파일을 만들어야한다.

경로를 맞추서 ~/quartz_jobs.xml 를 만들자.

<?xml version="1.0" encoding="UTF-8"?>

<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 				version="2.0">

  <schedule>
    <job>
      <name>JobDoneEmail</name>
      <group>JobDoneEmailGroup</group>
      <description>job done email send</description>
      <job-type>QuartzSample.Scheduler.EmailJob, QuartzSample</job-type>
      <!--      클래스이름(네임 스페이스 포함.)          어셈블리이름 -->
    </job>

    <trigger>
      <cron>
        <name>EmailQueTrigger</name>
        <group>EmailQueTriggerGroup</group>
        <job-name>JobDoneEmail</job-name>
        <job-group>JobDoneEmailGroup</job-group>
        <!-- trigger every 5min -->
        <cron-expression>0 0/5 * * * ?</cron-expression>
      </cron>
    </trigger>

  </schedule>
</job-scheduling-data>

중요한 점

  • trigger에서 job-name을 설정하는 부분이 위에서 job에서 설정한 job-name이여야 한다. 그룹도 마찬가지

  • job-type을 잘 설정해야하는데 조금전에 만든 클래스와 네임스페이스까지 포함해서 써줘야하고 컴마 다음에 들어가는건 이 프로젝트가 빌드 되면 나오는 dll이름을 써줘야한다. 프로젝트의 프로퍼티를 보면 잘 나와있다. 그걸 적어야한다.

마무리 작업

quartz_jobs.xml 가 빌드시마다 bin 폴더에 복사하게 해줘야한다.

파일을 선택후 프로퍼티를 보면 그림같은 부분이 나오는데 이부분을 Copy if newer 로 변경해줘야한다.

이제 실행하고 기다린다.

아마 이메일이 안올것이다. 왜냐면 iis가 처음 리퀘스트가 올때 클래스들을 로딩을 하기 때문에 웹사이트를 한번 로딩을 해줘야한다.

브라우져를 열고 한번 로딩을 하고 나면 바로 이메일이 오고 5분마다 이메일이 오는것을 확인할수 있다.

참고 작업

xml을 작업할때 인텔리센스가 안되면 xsd파일을 등록해줘야한다.

menu » xml » schema 를 선택하자. Add를 눌러서 추가해주면 인텔리센스가 동작한다.

teamsmiley's profile image

teamsmiley

2016-08-31 00:00

Read more posts by this author