[Java] 원하는 시간에 원하는 기능을 실행해 주는 Scheduler 라이브러리, Quartz v2.2.3

원하는 시간에 원하는 기능을 실행해 주는 스케줄러 기능을 Java에서 실행하기 위해서 가장 많이 사용되는 라이브러리가 Quartz입니다. Quartz는 기능을 안정적으로 실행할 수 있다는 장점과 함께, 특히 실행할 시간을 매우 유연하게 지정할 수 있습니다.

아래의 코드는 매 순간의 시간이 5초일때(5초마다가 아님) 특정한 기능, 즉 Job을 실행해 주는 코드입니다.

package quartz;

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;

public class MainEntry {
    public static void main(String[] args) {
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
		
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
			
            JobDetail job = newJob(TestJob.class)
                .withIdentity("jobName", Scheduler.DEFAULT_GROUP)
                .build();
			
            Trigger trigger = newTrigger()
                .withIdentity("trggerName", Scheduler.DEFAULT_GROUP)
                .withSchedule(cronSchedule("5 * * * * ?"))
                .build();
						
            scheduler.scheduleJob(job, trigger);
            scheduler.start();
        } catch(Exception e) {
            e.printStackTrace();
        }		
    }
}

26번째 코드를 보면 cronSchedule 함수를 통해 Job을 실행할 시간을 정하고 있습니다. 시간을 정하는 방식을 5 * * * * ?인데요. 순서대로 초 분 시 일 월 요일 년도(옵션)입니다. 즉 초를 5로 하고 나머지에 대해서는 * 또는 ?로 지정함으로써 매순간의 시간이 5초일때 Job을 실행하게 됩니다. 그럼, 실행할 Job은 어떻게 지정할까요? 20번 코드의 newJob 함수를 통해 지정하고 있습니다. Job으로 TestJob을 사용하고 있는데.. 이 TestJob의 코드는 아래와 같습니다.

package quartz;

import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TestJob implements Job {
    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        System.out.println("Job Executed [" + new Date(System.currentTimeMillis()) + "]"); 
    }
}

위의 예에서는 간단히 Job이 실행되는 시간과 Job Executed라는 문자열을 표시하는 일만 합니다.

Quartz 라이브러리는 http://www.quartz-scheduler.org/downloads 에서 받을 수 있으며, 다운로드 받은 jar 중 최소한 quartz-{version}.jar와 slf4j-api-{version}.jar를 참조해줘야 합니다.

회전 제한 및 양방향 성질을 가진 네트워크 DB를 활용한 A* 알고리즘

실제 도로망은 U턴 제한이나 우회전 제한 등과 같은 회전 제한에 대한 성질과 좌측 및 우측 차로에 대한 방향에 대한 성질을 가집니다. 이러한 성질에 대한 속성값을 가지는 네트워크 데이터는 지능형 교통체계 표준 노드링크 관리시스템(http://nodelink.its.go.kr)에서 제공하고 있습니다.

이 글은 지능형 교통체계 표준 노드링크 관리시스템에서 제공하는 네트워크 DB에 대해 A* 알고리즘을 적용하는 각 단계별 과정에 대한 상태정보를 기록한 자료에 대한 글입니다. A*에 대한 자세한 설명은 기존의 최단 경로 탐색 – A* 알고리즘이라는 글을 참고하시기 바랍니다. 본 글은 A* 알고리즘을 확장하고 응용한 글이므로 반드시 A* 알고리즘을 완전하게 이해하고 있는 상태에서만 의미있게 이해될 수 있는 글이라는 점을 알려드립니다.

해결하고자 하는 네트워크 DB에서의 최적경로에 대한 문제는 아래 그림과 같습니다.

위의 문제에 대해 확장된 A* 알고리즘을 통해 최종적으로 도출된 그 결과는 아래의 그림과 같습니다.

해결하고자 하는 문제와 그 결과 도출을 위한 알고리즘의 각 단계를 정리한 내용은 아래의 pdf 파일에 담겨 있습니다.