[java] Quartz Scheduler와 FTP 연동하기

Quartz Scheduler는 자바 애플리케이션의 작업을 예약하고 실행할 수 있는 라이브러리입니다. FTP(File Transfer Protocol)는 파일을 서버와 클라이언트 간에 전송하기 위한 프로토콜입니다. 이번 글에서는 Quartz Scheduler와 FTP를 연동하여 스케줄링된 작업을 FTP를 통해 파일을 전송하는 방법에 대해 알아보겠습니다.

필수 라이브러리

먼저 Quartz Scheduler와 FTP를 연동하기 위해서는 다음과 같은 라이브러리가 필요합니다.

Quartz Scheduler의 경우, Maven을 사용한다면 다음과 같이 의존성을 추가할 수 있습니다.

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

Apache Commons Net 라이브러리의 경우 Maven에서 다음과 같이 의존성을 추가할 수 있습니다.

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>

Quartz Scheduler 구성하기

Quartz Scheduler를 사용하기 위해서는 먼저 Scheduler를 구성해야 합니다. 이를 위해 quartz.properties 파일을 작성하고 다음과 같이 설정합니다.

org.quartz.scheduler.instanceName = MyScheduler
org.quartz.threadPool.threadCount = 10
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

위 설정은 MyScheduler라는 인스턴스를 생성하고, 10개의 쓰레드를 사용하는 스레드 풀을 지정합니다. 또한, 작업들을 메모리에 저장하기 위해 RAMJobStore를 사용합니다.

작업(Job) 정의하기

이제 Quartz Scheduler에 실행할 작업을 정의해야 합니다. 작업은 org.quartz.Job 인터페이스를 구현한 클래스로 생성할 수 있습니다. 아래는 작업 클래스의 예시입니다.

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 작업 실행 로직 작성
    }
}

작업 클래스에서는 execute() 메서드를 구현하여 작업 실행 로직을 작성합니다.

FTP 연결하기

FTP 연결을 위해서는 Apache Commons Net 라이브러리를 사용합니다. 아래는 FTP 서버에 연결하는 예시 코드입니다.

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

public class FTPConnection {
    public static void main(String[] args) {
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect("ftp.server.com", 21);
            ftpClient.login("username", "password");
            
            // FTP 작업 수행
            // ...
            
            ftpClient.logout();
            ftpClient.disconnect();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

위 코드에서는 FTPClient 클래스를 사용하여 FTP 서버에 연결하고, connect() 메서드와 login() 메서드를 통해 서버에 로그인합니다. 작업을 수행한 후에는 logout() 메서드와 disconnect() 메서드를 통해 연결을 종료합니다.

Quartz Scheduler와 FTP 연동하기

이제 Quartz Scheduler와 FTP를 연동하여 작업을 예약하고 FTP를 통해 파일을 전송하는 방법에 대해 알아보겠습니다. 아래는 예제 코드입니다.

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;

public class QuartzFTPJob {
    public static void main(String[] args) {
        try {
            // 스케줄러 생성
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            // 작업(Job) 생성
            JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("myJob").build();

            // 트리거(Trigger) 생성
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger").startNow().build();

            // FTP 작업 실행
            job.getJobDataMap().put("ftpClient", getFTPClient());
            job.getJobDataMap().put("filePath", "/path/to/file.txt");

            // 작업과 트리거 스케줄에 등록
            scheduler.scheduleJob(job, trigger);

            // 스케줄러 실행
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }
    }

    private static FTPClient getFTPClient() {
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient.connect("ftp.server.com", 21);
            ftpClient.login("username", "password");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return ftpClient;
    }
}

위 코드에서는 Quartz Scheduler를 생성하고, 작업과 트리거를 정의합니다. 예약된 작업이 실행될 때마다 FTP 작업을 수행하기 위해 작업 객체의 getJobDataMap() 메서드를 통해 FTPClient와 파일 경로 정보를 전달합니다.

시작과 동시에 스케줄링된 작업을 수행하기 위해 scheduler.start() 메서드를 호출합니다. 작업이 예약된 시간에 따라 주기적으로 실행됩니다.

결론

Quartz Scheduler와 FTP를 연동하여 작업을 예약하고 FTP를 통해 파일을 전송하는 방법에 대해 알아보았습니다. 이를 통해 자바 애플리케이션에서 스케줄링된 작업을 간편하게 관리하고 파일 전송을 자동화할 수 있습니다.

이 글은 Quartz Scheduler와 FTP 라이브러리를 사용한 예제 코드를 소개한 것으로 자세한 내용은 해당 라이브러리의 문서를 참고하시기 바랍니다.

참고: