본문 바로가기
개발/Spring

[Spring] xxl-job-admin으로 스프링 배치 스케쥴러 관리 3

by onethejay 2022. 6. 7.
728x90

Executor Job Handler 구현

이번 포스팅에서는 어드민에 등록된 Executor의 JobHandler를 호출했을 때 작업할 메서드를 구현하겠습니다.

서비스를 생성하고 호출 되었을때 로그를 출력하는 메서드(jobHandler)를 구현합니다.

import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Service;

@Service  //Service 혹은 Component 필수
public class SampleService {

    @XxlJob("sampleJobHandler")
    public void sampleJobHandlerMethod() {
        String str = "이것도 가능합니다.";
        XxlJobHelper.log("여기에 로그를 작성하면 확인할 수 있습니다. {}", str);
    }
}

프로젝트를 재시작하고 어드민에서 호출해봅니다.

호출 결과 성공, 실행도 성공하였습니다. 액션의 Rolling Log를 통해 로그를 확인할 수 있습니다.

Job handler로 parameter 전달

한번만 실행 혹은 Job 관리의 변경에서 param을 입력하여 전달할 수 있습니다.
이번 포스팅에서는 한번만 실행에 param을 입력하고 jobHandler에서 받아 출력해보겠습니다.

먼저 jobHandler 소스에 param 을 받는 부분을 추가합니다.

@Service
public class SampleService {

    @XxlJob("sampleJobHandler")
    public void sampleXxlJob() {
        String str = "이것도 가능합니다.";
        XxlJobHelper.log("여기에 로그를 작성하면 확인할 수 있습니다. {}", str);

        //********* 여기부터 *************
        // param parse
        String param = XxlJobHelper.getJobParam();
        if (param==null || param.trim().length()==0) {
            XxlJobHelper.log("param["+ param +"] invalid.");

            XxlJobHelper.handleFail();
        }

        XxlJobHelper.log("입력된 param은 {} 입니다.", param);
        //********** 여기까지 추가!! *************
    }
}

프로젝트를 재시작하고 어드민에서 한번만 실행시 param을 입력해 호출합니다.

이어서 호출 로그를 확인합니다.

param 입력시 문자열 그대로 전달되므로 일종의 규칙(key=value, key:value 등)을 정하여 데이터를 jobHandler로 보내고
전달받은 데이터를 Split하여 원하는 방식으로 작업을 진행할 수도 있습니다. (ex. 이미 완료된 작업의 데이터를 모두 삭제하고 다시 입력하고 싶을 때)

@Service
public class SampleService {

    @XxlJob("sampleJobHandler")
    public void sampleXxlJob() {
        String str = "이것도 가능합니다.";
        XxlJobHelper.log("여기에 로그를 작성하면 확인할 수 있습니다. {}", str);

        // param parse
        String param = XxlJobHelper.getJobParam();
        if (param==null || param.trim().length()==0) {
            XxlJobHelper.log("param["+ param +"] invalid.");

            XxlJobHelper.handleFail();
        }

        XxlJobHelper.log("입력된 param은 {} 입니다.", param);

        Map<String, String> paramMap = new HashMap<>();
        if (param != null) {
            String[] paramArr = param.split("=");
            paramMap.put("key", paramArr[0]);
            paramMap.put("value", paramArr[1]);

            XxlJobHelper.log("입력된 param을 split하여 map에 넣은 값은 {} 입니다.", paramMap);
        }
    }
}

또한, 위의 소스는 param에 데이터가 무조건 있어야 합니다. 데이터를 입력하지 않고 호출했을 경우 실행 실패하며 실패 로그를 확인할 수 있습니다.

사용자 관리

어드민 계정 이외에도 어드민 권한을 가진 계정을 생성하거나 특정 Executor에만 접근 가능한 일반 계정을 생성할 수 있습니다.

사용자 관리 메뉴로 이동합니다.

사용자 추가 버튼을 클릭합니다.
일반 사용자 권한은 접근 가능한 Executor를 여러개 선택할 수 있습니다.

어드민 권한은 계정 이름과 비밀번호만 설정할 수 있습니다.

테스트를 위해 일반 계정으로 생성하겠습니다. 편의를 위해 비밀번호는 모두 출력됩니다.

생성한 계정으로 로그인합니다. Executor, 사용자 관리는 불가능하며 Job 관리만 접근 가능합니다.

Job 관리 화면 접근시 에러 메세지가 나타납니다. 연결된 Executor가 하나도 없어서 입니다.

관리자로 로그인하여 Executor를 설정합니다.

다시 일반 계정으로 로그인하면 Job 관리 화면을 확인할 수 있습니다.

Job 호출도 성공하였습니다.

Schedule과 Cron 설정

Job의 Cron을 설정하면 특정 시간에 예약을 설정할 수 있습니다.

이번에 생성한 Job은 매 분 00초와 30초마다 호출되도록 설정하였습니다.

설정 후 액션에서 시작하면 상태가 RUNNING으로 출력됩니다.

호출 로그를 확인하면 해당 Job을 매 분 00초와 30초마다 호출한것을 확인할 수 있습니다.

마치며…

이전과 이번 포스팅을 통해 스프링 일괄 작업을 관리할 수 있는 XXL-JOB-ADMIN을 세팅해보았습니다.

일반 Scheduler로 사용하던 부분에 비해 추가로 세팅해야하는 것들이 필요하지만, 세팅이 완료되고 나면 이전보다 훨씬 관리하기 수월해질 것이라고 생각됩니다.

어드민은 아직 번역이 되지 않았거나 문장이 어색한 부분들을 시간이 나는 대로 수정하고 있습니다.

해당 소스는 오픈소스이며 GPL v3 라이센스를 따르고 있습니다.
공식사이트 https://github.com/xuxueli/xxl-job

운영환경에 반영 예정이라면, 개발 혹은 테스트에서 충분히 확인하신 후 사용하시기 바랍니다.

감사합니다.

728x90

댓글