복붙노트

[SPRING] 응용 프로그램 인수에 따라 실행할 스프링 배치 작업을 선택하는 방법 - spring boot java config

SPRING

응용 프로그램 인수에 따라 실행할 스프링 배치 작업을 선택하는 방법 - spring boot java config

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

@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);
    }    

}

추신 Spring 구성 및 Spring 배치에서 Java 구성의 새로운 구성입니다.

해결법

  1. ==============================

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

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

  2. ==============================

    2.main 메소드에서 원하는 작업을 실행하려면 애플리케이션 컨텍스트에서 필요한 작업 구성 빈과 JobLauncher를로드 한 다음 실행하십시오.

    main 메소드에서 원하는 작업을 실행하려면 애플리케이션 컨텍스트에서 필요한 작업 구성 빈과 JobLauncher를로드 한 다음 실행하십시오.

    @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);
        }
    }
    

    내 혼란을 많이 일으키는 이유는 첫 번째 작업이 러너에 의해 "선택"된 것처럼 보였음에도 불구하고 두 번째 작업이 실행되었다는 것입니다 ... 글쎄 문제는 두 작업의 구성 파일에서 표준 메서드 이름 작가 ( ), reader (), processor () 및 step ()을 사용하여 경고없이 첫 번째 작업의 작업을 "덮어 쓰는"것으로 보이는 두 번째 작업의 작업을 사용했습니다. @EnableBatchProcessing (모듈러 = 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 (작업 / 학습 진행 중)에서 코드를 사용할 수 있습니다.

  3. ==============================

    3.CommandLineJobRunner가 있으며 아마도 도움이 될 수 있습니다. 그것의 javadoc에서

    CommandLineJobRunner가 있으며 아마도 도움이 될 수 있습니다. 그것의 javadoc에서

  4. from https://stackoverflow.com/questions/25122103/how-to-select-which-spring-batch-job-to-run-based-on-application-argument-spri by cc-by-sa and MIT license