인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

ehddbs452100님의 프로필 이미지

작성한 질문수

스프링 배치

특정 job만 실행

작성

·

27

·

수정됨

1

해당 강의를 보고 jenkins를 이용해서 spring batch를 실행하려고합니다.

현재 application.yml은 아래와 같이 enabled: false로 해놓았습니다.

spring:
  batch:
    job:
      fail-on-job-failure: true
      enabled: false
    jdbc:
      initialize-schema: never

젠킨스의 파이프라인인데 파라미터 주입은 잘되었습니다. 그런데 job은 생성이 되었다고 로그가 찍히고 spring도 실행중인데 명시해놓은 job을 실행을 안하네요...

2025-03-08T12:51:30.900+09:00  INFO 5801 --- [           main] l.l.e.job.LostItemSearchJobConfig        : 🔵 Job 생성: dailyElasticStoreJob
2025-03-08T12:51:32.179+09:00  INFO 5801 --- [           main] l.l.LostNoMoreBatchApplication           : Started LostNoMoreBatchApplication in 13.915 seconds (process running for 15.394)
Ab
java -Duser.timezone=Asia/Seoul -jar /var/jenkins_home/LOST-NO-MORE.jar \\
                        --spring.batch.job.names=dailyElasticStoreJob \\
                        --spring.batch.job.parameters="START_DATE=${params.START_DATE},END_DATE=${params.END_DATE}"

application.yml에서 enabled: true로하고 job:name=dailyElasticStoreJob로하니깐 되고 어떤게 문제인지 모르겠습니다. 파이프라인은 문제가 없는데 자꾸 spring이 실행 중이고 job을 구동하지 않네요. 직접 JobLauncher를 이용해야하는 방법 밖에 없는 지 궁금합니다.

답변 1

1

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

ehddbs452100님, 젠킨스에서 스프링 배치 작업을 실행하려고 할 때, application.yml에서 spring.batch.job.enabled: false로 설정한 경우, 스프링 배치가 시작 시점을 자동으로 실행하지 않습니다. 이 설정은 기본적으로 배치 작업의 자동 실행을 비활성화합니다.

현재 파이프라인 스크립트를 보면, 명령어에서 --spring.batch.job.names=dailyElasticStoreJob를 사용하여 특정 Job을 실행하도록 설정하고 있는데, 이 방법으로는 자동 실행이 설정되지 않을 경우 사용할 수 있는 대체 방법입니다.

하지만 자동 실행을 사용하지 않을 것이기 때문에 직접 JobLauncher를 사용해서 명시적으로 Job을 실행하는 방법을 고려해 볼 수 있습니다. JobLauncher를 통해 직접적으로 Job을 실행하는 코드를 작성하면, 수동으로 실행을 제어할 수 있습니다.

다음은 JobLauncher를 사용하는 간단한 예시입니다:

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class JobInvoker {
    
    @Autowired
    private JobLauncher jobLauncher;
    
    @Autowired
    private Job job; //실행하고자 하는 Job

    public void runJob() throws Exception {
        jobLauncher.run(
            job,
            new JobParametersBuilder()
                .addString("paramKey", "paramValue") // 필요한 매개변수 추가
                .toJobParameters()
        );
    }
}

해당 방법으로 스프링 실행 중임에도 불구하고(Job이 자동으로 실행되지 않는 경우) 특정 job을 명시적으로 수행할 수 있습니다. 또한, 이런 식으로 직접 제어할 경우, 배치 작업의 실행 시점을 좀 더 유연하게 관리할 수 있는 장점이 있습니다.

혹시 더 궁금하신 점이 있으면 언제든지 질문해 주세요!

Spring Boot Reference Documentation에서 더 많은 정보를 찾아볼 수 있습니다.