JobExplorer
- org.springframework.batch.core.explore.JobExplorer
스프링 배치는 내부적으로 여러 DAO를 사용해 JobRepository 테이블에 접근 하긴 하지만, 프레임워크와 개발자가 사용할 수 있도록 훨씬 실용적인 API 를 제공하기도 한다. 그중 JobExplorer 컴포넌트를 사용하여 데이터 저장소(메타데이터)에 접근 가능하다.
그림에서 대부분의 배치 프레임워크 컴포넌트가 JobRepository를 사용해 잡 실행에 관련해 저장된 정보에 접근 하지만 JobExplorer는 데이터 베이스에 직접 접근한다. 또한 JobExplorer 는 읽기 전용으로 사용된다.
사용하려는 데이터에 안전한 방법으로 접근하고 싶다면 JobExplorer 와 같은 API 를 사용하기 바란다.
- jobExplorer 는 JobInstance및 JobExcution과 관련된 정보를 얻을 수 있는 7가지 메서드를 제공한다.
- 예제
package demo;
import java.util.List;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@EnableBatchProcessing
@SpringBootApplication
public class DemoApplication {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private JobExplorer jobExplorer;
@Bean
public Tasklet explorerTasklet() {
return new ExploringTasklet(this.jobExplorer);
}
@Bean
public Step explorerStep() {
return this.stepBuilderFactory.get("explorerStep")
.tasklet(explorerTasklet())
.build();
}
@Bean
public Job explorerJob() {
return this.jobBuilderFactory.get("explorerJob")
.start(explorerStep())
.build();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
public class ExploringTasklet implements Tasklet {
private JobExplorer explorer;
public ExploringTasklet(JobExplorer explorer) {
this.explorer = explorer;
}
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
String jobName = chunkContext.getStepContext().getJobName();
List<JobInstance> instances = explorer.getJobInstances(jobName, 0, Integer.MAX_VALUE);
System.out.println(
String.format("There are %d job instances for the job %s",
instances.size(),
jobName));
System.out.println("they have had the following result");
for (JobInstance instance : instances) {
List<JobExecution> jobExecutions = this.explorer.getJobExecutions(instance);
System.out.println(String.format("Instance %d had %d executions",
instance.getInstanceId(),
jobExecutions.size()));
for (JobExecution jobExecution : jobExecutions) {
System.out.println(String.format("\tExecution %d resulted in Exit Status %s", jobExecution.getId(), jobExecution.getExitStatus()));
}
}
return null;
}
}
}
반응형
'spring' 카테고리의 다른 글
[Spring] Transaction PROPAGATION.REQUIRES_NEW 의 '독립'이란 의미? (0) | 2022.08.24 |
---|---|
[토비의 스프링 3.1] 3장 - 템플릿/콜백의 응용 (0) | 2022.05.01 |
[REDIS] Generic Redis Template 사용하기 (0) | 2022.02.09 |
Quartz Tutorials 정리(중) (2) | 2021.10.16 |
[Spring Boot 실행 오류]The Tomcat connector configured to listen on port 8080 failed to start. The port may already be in use or the connector may be misconfigured. (0) | 2019.08.18 |