1. Job
2. Job의 구조
Jobparametes는 이후에 학습할 도메인
JobLauncher도 이후에 학습 예정
BatchJob을 구성하고 실행시키는 주체는 JobLauncher 클래스이다.
job을 실행시킬 때 필요한 인자는 Job객체와 JobParameters라는 도메인 객체를 가지고 JobLauncher가 실행시킨다.
Job은 내부적으로 Job을 구성할 때 여러 Step을 포함해서 구성한다.
Job은 하나의 도메인 객체고 interface로 제공되지만 SimpleJob은 Step을 포함하고 있는 일종의 컨테이너 역할을 한다.
Steps라는 리스트를 품고 있고
job이 구도오디면 Step1, 2, 3 을 실행시키는 구조이다.
Job은 최상위 interface이고 execute 메서드가 있다. (Jobexecution을 받아서 실행시킨다.)
interface를 상속한 AbstractJob이 존재한다.
Job 이름, 재시작 여부, 메타데이터 저장소, Job 이벤트 리스터 (이벤트가 발생하는 시점에 Listener에서 특정한 역할을 할 수 있는 것임),
AbstractJob을 상속받고 있는 것이 2가지가 있다.
Steps를 포함하는 SimpleJob과
Flow 객체를 담는 변수를 담 있는 FlowJob이 있다.
3. JobInstance
JobConfiguration jog.get("a").start(step1()
SimpleJobBuilder.class 에서 steps에 step을 넣게 됨
.build()
SimpleJobBuilder에서 SimpleJob을 만들고 그 안에 steps를 집어넣는다.
step에는 모든 buisiness logic을 담는 것이고
job은 step을 포함하고 있으니가 모든 내용들을 포함하고 있다고 보면 된다.
실행
spring boot 같은경우에는 simple job을 자동으로 실행시켜준다.
BatchAutoConfiguration에서 JobLauncherApplicationRunner 가 하는 역할이다.
JobLauncherApplicationRunner 는 Joblauncer 클래스를 가지고 job을 실행시키는 역할을 한다.
SimpleJobLauncher.class 에서 job.execute를 통해 job이 실행된다.
4. JobParameter
JobParameters는 LinkedHashMap을 가지고 있고 key와 value로 값을 설정할 수 있다.
value 속성은 Jobparameter이며
JobParameter의 parameter에 key와 value로 값이 지정된다.
job을 실행시키는 joblauncher을 의존성 주입을 받는다.
spring batch가 초기화 될때 bean으로 생성이 되어있기 떄문에 의존성 주입을 받을 수 있다.
우리가 구성한 batch job을 의존성 주입을 받는다.
즉 jobinstanceConfiguration에서 정의한 job이 bean으로 생성되어 있으니 의존성 주입을 받는 것이다.
jobLauncher를 가지고 실행해보자.
jobLauncher는 두개의 인자를 필요로 한다. job 타입의 객체와, jobParameters라는 도메인 객체를 인자로 전달해야한다.
job은 위에서 의존성 주입 받은 것을 사용하면 되고
jobparameters는 새로 구성해야한다.
jobParameters를 만드는 builder 클래스를 제공하고있다.
JobParametersBuilder()를 이용하면 되고
총 네가지의 타입을 지원한다. addString, addLong, addDate, addDouble
package io.springbatch.springbatch;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.Date;
// bean 등록
@Component
@RequiredArgsConstructor
public class JobRunner implements ApplicationRunner {
private final JobLauncher jobLauncher;
private final Job job;
@Override
public void run(ApplicationArguments args) throws Exception {
JobParameters jobParameters = new JobParametersBuilder()
.addString("name", "user1")
.addLong("seq", 2L)
// .addDate("date", new Date())
.addDouble("age", 16.5)
.toJobParameters();
jobLauncher.run(job, jobParameters);
}
}
5. 자동 실행 방지 설정
application.yml에서
spring.batch.job.enabled = false로 설정을 변경해준다.
# 기본 동작은 local로
spring:
profiles:
active: local
---
spring:
config:
activate:
on-profile: local
datasource:
hikari:
jdbc-url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
driver-class-name: org.h2.Driver
batch:
jdbc:
initialize-schema: embedded
---
spring:
config:
activate:
on-profile: mysql
datasource:
hikari:
jdbc-url: jdbc:mysql://localhost:3306/springbatch?useUnicode=true&characterEncoding=utf8
username: root
password: 1111
driver-class-name: com.mysql.cj.jdbc.Driver
batch:
jdbc:
# schema 생성과 관련한 option
initialize-schema: always
job:
# 자동 실행 방지
enabled : false
실행정보, 상태정보를 데이터 베이스에 저장하기 위해 사용하는 용도로
시점마다 생성되는 용도로, 생성되어지고, 역할을 수행하는 도메인들이
JobInstance JobExecution, JobParameters이다.
1. jar 파일을 실행할 때 parameter 입력
jar파일을 생성하고, jar파일을 실행할 때 argument로 job parameter 값을 전달 할 수 있다.
job parameter 값을 전달할 때는 type을 꼭 같이 써줘야 에러가 발생하지 않는다.
2. intellij, edit configuration에서 parameter 지정
intellij를 이용해서 job parameter 값을 전달할 수도 있다.
3. ApplicationRunner interface를 구현하여, spring batch 실행 시 사용할 parameter 지정
아래와 같이 직접 값을 입력해 놓을수도 있다.
@Component
@RequiredArgsConstructor
public class JobRunner implements ApplicationRunner {
private final JobLauncher jobLauncher;
private final Job job;
@Override
public void run(ApplicationArguments args) throws Exception {
JobParameters jobParameters = new JobParametersBuilder()
.addString("name", "user1")
.addLong("seq", 2L)
.addDate("date", new Date())
.addDouble("age", 16.5)
.toJobParameters();
jobLauncher.run(job, jobParameters);
}
}
+ jobParameter를 확인하는 방법
jobparameter를 확인하는 방법은 Stepcontribution 또는 Chunkcontext를 이용하여 확인할 수 있다.
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
// jobparameter를 확인하는 방법 1
JobParameters jobParameters = contribution.getStepExecution().getJobExecution().getJobParameters();
jobParameters.getString("name");
jobParameters.getLong("seq");
jobParameters.getDate("date");
jobParameters.getDouble("age");
// jobparameter를 확인하는 방법 2
// 동일한 값을 얻을 수 있지만 값을 확인만 하는 용도로 사용
Map<String, Object> jobParameters1 = chunkContext.getStepContext().getJobParameters();
System.out.println("step1 was executed");
return RepeatStatus.FINISHED;
}
}).build();
}
'강의 > 스프링배치' 카테고리의 다른 글
스프링 배치 도메인 이해 - step (0) | 2022.12.28 |
---|---|
스프링 배치 도메인 이해 - JobExecution (0) | 2022.12.27 |
스프링 배치 - DB 스키마 생성 (2) (0) | 2022.12.26 |
스프링 배치 시작 - DB 스키마 생성 및 이해 (1) (0) | 2022.12.25 |
스프링 배치 시작 - 연습용 배치 생성 (0) | 2022.12.24 |