응용 프로그램 인수를 기반으로 실행할 스프링 배치 작업 선택 방법 - 스프링 부트 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
'programing' 카테고리의 다른 글
Hibernate가 org.hibernate를 던지는 이유는 무엇입니까?예외.잠금 획득예외? (0) | 2023.07.22 |
---|---|
Git는 왜 이 텍스트 파일을 이진 파일로 취급합니까? (0) | 2023.07.22 |
docker-compose의 env-file 및 MariaDB (0) | 2023.07.22 |
MariaDB에서 트랜잭션을 만들어 IP 블랙리스트의 만료 시간을 설정합니다. (0) | 2023.07.22 |
스프링부츠 MVC 멀티모듈 실행가능항아리 (0) | 2023.07.22 |