달력

12

« 2024/12 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
지난번에는 Quartz를 사용하기 위한 개략적인 설명과 라이브러리 사용을 위한 문서들의 위치에 대해서 이야기 했었다.

오늘은 Quartz사용시 알아야할, 기본적이지만 정말로 중요한 개념인 Trigger와 JobDetail에 대해서 이야기 하려고 한다.

먼저, Quartz에서 Scheduling 할 수 있은 범위 또는 Scope에 대해서 설명하고, 이어서 두가지에 대해서 말하려 한다.

[Job Scheduling]
  • on certain days of the week (주중의 지정한 날: 특정 요일)
  • on certain days of the month (달주의 지정한 날: 특정 날짜)
  • on certain days of the year (연주의 지정한 날: 특정 날짜)
  • not on certain days listed within a registered Calendar (such as business holidays)
  • repeated a specific number of times (반복횟수)
  • repeated until a specific time/date (종료 시점 지정)
  • repeated indefinitely (무한 반복)
  • repeated with a delay interval (다음 실행을 위한 타임 인터벌)

    위에서와 같이 스케즐러를 실행하기 위한 모든 범주들에 대해서 쿼츠는 커버 가능하다.
    여기서 Job(JobDetail)과 Trigger에 대한 개념을 알아야 하는데,

    먼저 Job에 대해 설명하면 Job는 실행해야 할 작업으로 이해하면 된다. 예를 들면 메이을 보낸다든지, 필요없는 로그 파일들을 정리하거나, 시스템의 자동화된 작업들을 들수 있다.
    여기서는 실행되는 시간에 대한 개념은 없고, 단순히 일의 단위만 생각하면 된다.

    Trigger는 Job의 실행을 위한 조건들이라고 생각하면 이해가 쉽다. 실행될 시간, 반복횟수 또는 Interval time등 여러가지 실행 조건들을 생각하면 되는데, Sheduler이니까 시간에 대한 조건들을 포함하고 있다.(시간 기반으로 동작)

    Quartz기반으로 실행할 작업을 만들려면, Job과 Trigger를 각각 정의해서 묶어주면 된다.
    여기서 Job은 Interface 정의되어 있다. 우리는 이를 상속받아 원하는 작업들을 정의하게 된다. 그리고 Quzrtz의 Sheduler가 실행될때, Job에 대해 이해할 수 있도록 JobDetail를 정의하면 된다.

    .Job interface

    void execute(JobExecutionContext context)


    .JobDetai 클래스의 생성자

    JobDetail(String name, String group, Class jobClass) 

      위 코드에서 name과 group는 Job를 위한 Job이름과 JobGroup를 의미한다. 이는 관리를 편하게 하기 위한 것인데, 필요시 이를 이용하여 Job의 검색이 가능하고, 만약 null값을 넣어 준다면, DEFAULT 그룹명이 할당 된다.

    Trigger클래스는 JobDetail클래를 이용하여 정해진 시간에 실행이 되도록 스케즐러가 관리하는데, 이는 아래와 같은 코드를 통해서 Job에 대한 정보들을 가져오게 된다. 아래 코드는 Job의 name와 Grouup명만 있을 뿐, 직접적으로 할당하지 않지만, 내부적으로는 위에서 정의한 job의 name과 group name을 참조하여 가져오게 된다.

    Trigger(String name, String group, String jobName, String jobGroup)

    여기도 name과 group가 있는데, 이는 Trigger의 이름과 group 명이다.

    다음에는 코드를 이용하여 실제로 Job과 Trigger을 정의하고 사용하는 방법에 대해서 설명하려 하다.

  • :
    Posted by 행복상자
    제목을 써 놓고 보니 참 거창하게 보이는데, 사실은 별로 거창할 것은 없고, Quartz와 Spring Framework를 만드시고, 지속적으로 update하고 있는 개발자들에게 무한한 감사를 올릴 뿐이다. 일반적으로 Scheduler 또는 Task Manager는 어떤 행위에 대하여 주기적으로 실행시키고, 되풀이 하도록 만들어진 Application 또는 Process의 일종이다.
    하지만, 실행에 대해서는 책임을 질뿐, 실행 결과에 대해서는 책임을 지지 않는다. 실행의 결과는 어떤 행동 또는 어떠한 목적성을 가지고 있는 모듈에서 우선적인 책임을 지게 된다.
     
     
    이러한 아키텍처의 장점은 모듈 상화간에, 오브젝트간의 의존성을 줄여줄수 있어, 수정하기 쉽고, 개념적으로도 이해하기 쉽다는 장점이 있다.
    지난주는 Quartz의 API와 Spring의 소스를 분석하면서 내가 생각하고 상상했던 것보다 더 잘 만들어진 프로그램들이라는 생각이 머리에서 떠나지 않았다.

    처음에는 Spring을 이용해서 간단한 예제를 통해서, 내가 행하고자 하는 작업들을 예약하고 실행하는 것은 그렇게 어렵지 않았다. 하지만, 실제 실행되고 있는 Job정보와 Trigger에 대한 정보를 알아오기 위해서는 직접 Quartz에서 제공하는 Scheduler의 Instance를 통해서 작업을 할 수 밖에 없기에, 결국 Quartz의 API와 Ducuments들을 찾아 봐야 했다.
    물론, Quartz에서 알아햐 하는 기본적인 클래스는 JobDetail와 Trigger와 Schedule이다.

    이들을 통해서 내가 직접 Task Manager를 구현하다가, 갑자기 두가지가 생각이 났다.

    첫째로, 왜 내가 Spring Framework를 사용하지?
    둘째로, Quartz와 Transacting 그리고, Data Source의 연동에 대해서는 얼마나 많은
               작업들을 추가로 더 해주어야 할까?


    사실 내가 Task Manager를 새로짜기 시작한 것은, Spring Framework의 ApplicationContext에서 xml파일로 정의된 JabDetailBean와 TriggerBean에 대해 최초 1회만 읽어서 스프링이 관하는 Map에 읽어올뿐, 만약 내가 새로운 작업 또는 Trigger를 추가하려면, 직접 Quartz의 Scheduler intergace를 얻어와서 코딩을 해주어야만 했기 때문이었다. 직접 코딩을 하려면,차라리 전체를 짜는 것이 나을 것 같았었다.

    하지만, 두가지 생각이 떠오른 후에, 다시 한번 생각해 보았다.
    분명의 Spring Framework을 만든 사람들은 나보다 나은 사람들일 것이다. 나는 지극히 평범한 개발자중의 한명인데, 그 들은 내가 알지 못하는 것까지 생각해서 만들었을 것이니까, 나는 단지 그 것을 빨리 찾으면 될건데 아직 모르고 있을 뿐인걸..

    그래서 나는 다시 Spring의 소스를 분석해 보았다.
    역시 내가 예상했던대로, JobDetail과 Trigger를 새로 추가하는 방법이 숨겨져 있었다.
    SchedulerFactoryBean 클래스는 어떤 값을 설정할때 setter를 통해서 설정하게 되어 있다.
    (그럴만도 한게, DI를 이용하기 위해서라고 생각된다.)

    그러나 별로로 Add나 Remove를 위한 method는 제공하지 않는다. (그래서 처음에 Spring의 Scheduler 사용을 포기 했었다, 하지만 새로운 Job와 Trigger를 추가하는 것은 가능하다.)

    이야기가 길이에 대한 자세한 내용은 추후에 정리해서 공유할 예정이다.
    먼저,
          - Quertz에 대한 설명
          - Quertz의 Trigger와 JobDetail
          - Job와 Trigger의 Add, Delete
          - Spring에서의 Quartz 사용
          - Spring을 이용한 Task Manager작성

    이런식으로 정리할 될것같다. (내 기억력은 항상 한계치라, 잊기 전에 작성을 해야 하는데...)

    스프링 코드를 보는 것은 결코 나쁘지 않다. 좋은 코드는 좋은 코드를 만들도록 도와준다.
    이를 통해서 더 나은 것을 만들기를 바라는 것이 현재를 살고 있는 오픈소스를 통해서 기여하고 있는 훌륭한 개발자들의 바람일 것이다. 그리고 나의 바람인데, 나는 그들중에 들기에는 부끄럽다. 단시 좋아할 뿐이다.

    :
    Posted by 행복상자