[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."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.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.CommandLineJobRunner가 있으며 아마도 도움이 될 수 있습니다. 그것의 javadoc에서
CommandLineJobRunner가 있으며 아마도 도움이 될 수 있습니다. 그것의 javadoc에서
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
'SPRING' 카테고리의 다른 글
[SPRING] 나머지 템플릿 사용자 정의 예외 처리 (0) | 2019.02.05 |
---|---|
[SPRING] 메모리에 바이트 배열을 사용하여 Java 파일 객체 (또는 동등 물)를 만듭니다 (실제 파일은 제외). (0) | 2019.02.05 |
[SPRING] 보안 Spring 부트 애플리케이션의 정적 컨텐츠 액세스 (0) | 2019.02.05 |
[SPRING] 왜 WEB-INF 폴더 안에 jsp 파일이 작동하지만 WEB-INF 아래에있는 폴더 아래에 놓여 있습니까? (0) | 2019.02.05 |
[SPRING] Flyway / Spring 및 H2 내장 데이터베이스에 대한 스키마 관련 문제 (0) | 2019.02.05 |