programing

응용 프로그램 인수를 기반으로 실행할 스프링 배치 작업 선택 방법 - 스프링 부트 Java 구성

topblog 2023. 7. 22. 09:08
반응형

응용 프로그램 인수를 기반으로 실행할 스프링 배치 작업 선택 방법 - 스프링 부트 Java 구성

동일한 인프라 관련 원두를 사용하고 싶어서 같은 프로젝트에서 두 개의 독립적인 스프링 배치 작업을 하고 있습니다.모든 것이 Java로 구성되어 있습니다.예를 들어 메인 메서드의 첫 번째 Java app 인수를 기반으로 작업을 독립적으로 시작할 수 있는 적절한 방법이 있는지 알고 싶습니다.내가 뛰면,SpringApplication.run두 번째 작업만 마법으로 실행됩니다.주요 방법은 다음과 같습니다.

@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {                
        SpringApplication app = new SpringApplication(Application.class);
        app.setWebEnvironment(false);
        ApplicationContext ctx= app.run(args);              
    }

}

두 작업은 Spring.io 의 Spring Batch Getting Started 자습서에 나와 있는 대로 구성됩니다.다음은 첫 번째 작업의 구성 파일이며 두 번째 작업도 같은 방식으로 구성됩니다.

@Configuration
@EnableBatchProcessing
@Import({StandaloneInfrastructureConfiguration.class, ServicesConfiguration.class})
public class AddPodcastJobConfiguration {

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;
    //reader, writer, processor...

}

모듈화를 활성화하기 위해 AppConfig 클래스를 만들었습니다. 여기서 두 가지 작업에 대한 공장을 정의합니다.

@Configuration
@EnableBatchProcessing(modular=true)
public class AppConfig {

    @Bean
    public ApplicationContextFactory addNewPodcastJobs(){
        return new GenericApplicationContextFactory(AddPodcastJobConfiguration.class);
    }

    @Bean
    public ApplicationContextFactory newEpisodesNotificationJobs(){
        return new GenericApplicationContextFactory(NotifySubscribersJobConfiguration.class);
    }    

}

추신: Java 구성 Spring Boot 및 Spring Batch의 Spring 구성이 처음입니다.

"spring.batch.job.names=myJob" 속성을 설정하기만 하면 됩니다.응용 프로그램을 시작할 때 시스템 속성으로 설정할 수 있습니다(-Dspring.batch.job.names=myjob).이 속성을 정의한 경우 spring-batch-starter는 이 속성에 의해 정의된 작업만 시작합니다.

기본 방법에서 원하는 작업을 실행하려면 응용 프로그램 컨텍스트에서 필요한 작업 구성 빈 및 작업 실행기를 로드한 다음 실행할 수 있습니다.

@ComponentScan
@EnableAutoConfiguration
public class ApplicationWithJobLauncher {

    public static void main(String[] args) throws BeansException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException, JobParametersInvalidException, InterruptedException {

        Log log = LogFactory.getLog(ApplicationWithJobLauncher.class);

        SpringApplication app = new SpringApplication(ApplicationWithJobLauncher.class);
        app.setWebEnvironment(false);
        ConfigurableApplicationContext ctx= app.run(args);
        JobLauncher jobLauncher = ctx.getBean(JobLauncher.class);
        JobParameters jobParameters = new JobParametersBuilder()
            .addDate("date", new Date())
            .toJobParameters();  

        if("1".equals(args[0])){
            //addNewPodcastJob
            Job addNewPodcastJob = ctx.getBean("addNewPodcastJob", Job.class);          
            JobExecution jobExecution = jobLauncher.run(addNewPodcastJob, jobParameters);                   
        } else {
            jobLauncher.run(ctx.getBean("newEpisodesNotificationJob",  Job.class), jobParameters);   

        } 

        System.exit(0);
    }
}

저의 많은 혼란을 야기시킨 것은 첫 번째 작업이 주자에 의해 "픽업"되는 것처럼 보였음에도 불구하고 두 번째 작업이 실행되었다는 것입니다.문제는 두 작업 모두의 구성 파일에서 표준 메서드 이름을 사용했다는 것입니다.writer(), reader(), processor() and step()그리고 그것은 첫 번째 직업의 사람들을 아무런 경고 없이 "보내는" 것처럼 보이는 두 번째 직업의 사람들을 사용했습니다.응용 프로그램 구성 클래스를 통해 사용했습니다.@EnableBatchProcessing(modular=true)Spring Boot에서 마법처럼 사용될 것이라고 생각했습니다.

@Configuration
@EnableBatchProcessing(modular=true)
public class AppConfig {

    @Bean
    public ApplicationContextFactory addNewPodcastJobs(){
        return new GenericApplicationContextFactory(AddPodcastJobConfiguration.class);
    }

    @Bean
    public ApplicationContextFactory newEpisodesNotificationJobs(){
        return new GenericApplicationContextFactory(NotifySubscribersJobConfiguration.class);
    }    

}

준비가 되면 블로그에 글을 쓰겠지만, 그때까지 코드는 https://github.com/podcastpedia/podcastpedia-batch 에서 확인할 수 있습니다(작업/학습 진행 중).

CommandLine JobRunner가 있으며 도움이 될 수 있습니다.
에서.

명령줄에서 작업을 시작하기 위한 기본 시작 프로그램

Spring Batch 자동 구성은 컨텍스트 내에 @Enable Batch Processing(Spring Batch에서)을 추가하여 활성화할 수 있습니다.기본적으로 시작 시 응용 프로그램 컨텍스트의 모든 작업을 실행합니다(자세한 내용은 JobLauncher CommandLineRunner 참조).spring.batch.job.names(쉼표로 구분된 작업 이름 패턴)를 지정하여 특정 작업 또는 작업으로 범위를 좁힐 수 있습니다.

스프링 부트 문서

또는 기본 메서드에 전달된 인수를 기반으로 JobLauncher를 사용하여 자동 실행을 실행 중지하고 컨텍스트에서 프로그래밍 방식으로 작업을 실행합니다.

언급URL : https://stackoverflow.com/questions/25122103/how-to-select-which-spring-batch-job-to-run-based-on-application-argument-spri

반응형