Spring Batch initializr / 스케쥴러 만들기

Jiho Park·2022년 2월 9일
0
post-thumbnail

목적

한 줄 요약 > 데이터의 반복 처리, 가공, 시간 기반 이벤트 처리를 위해 사용
활용 범위 확장 > logging/tracing, 트랜잭션 관리, 잡 프로세싱 통계, 잡 재시작, 스킵, 리소스 관리 등

발췌 : Spring Batch Introduction -https://docs.spring.io/spring-batch/docs/current/reference/html/spring-batch-intro.html#spring-batch-intro

개발환경

What You Need About 15 minutes
💻 JDK 1.8 or later / Gradle 4+ or Maven 3.2+
IDE: Spring Tool Suite (STS) /IntelliJ IDEA

Basic Sample

Download and unzip the source repository for this guide, or clone it using Git: git clone

"https://github.com/spring-guides/gs-batch-processing.git"

@BatchProcessingApplication.java
Apply Spring Boot's Application Exit support

package com.example.batchprocessing;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BatchProcessingApplication {

	public static void main(String[] args) throws Exception {
		System.exit(SpringApplication
        .exit(SpringApplication
        .run(BatchProcessingApplication.class, args)));
	}
}

@BatchConfiguration.java
Switch to tabs, and adjust tabsizing in asciidoctor.

// tag::setup[]
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

	@Autowired
	public JobBuilderFactory jobBuilderFactory;

	@Autowired
	public StepBuilderFactory stepBuilderFactory;
	// end::setup[]

	// tag::readerwriterprocessor[]
	@Bean
	public FlatFileItemReader<Person> reader() {
		return new FlatFileItemReaderBuilder<Person>()
			.name("personItemReader")
			.resource(new ClassPathResource("sample-data.csv"))
			.delimited()
			.names(new String[]{"firstName", "lastName"})
			.fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
				setTargetType(Person.class);
			}})
			.build();
	}

	@Bean
	public PersonItemProcessor processor() {
		return new PersonItemProcessor();
	}

	@Bean
	public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
		return new JdbcBatchItemWriterBuilder<Person>()
			.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
			.sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
			.dataSource(dataSource)
			.build();
	}
	// end::readerwriterprocessor[]

	// tag::jobstep[]
	@Bean
	public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
		return jobBuilderFactory.get("importUserJob")
			.incrementer(new RunIdIncrementer())
			.listener(listener)
			.flow(step1)
			.end()
			.build();
	}

	@Bean
	public Step step1(JdbcBatchItemWriter<Person> writer) {
		return stepBuilderFactory.get("step1")
			.<Person, Person> chunk(10)
			.reader(reader())
			.processor(processor())
			.writer(writer)
			.build();
	}
	// end::jobstep[]
}

@JobCompletionNotificationListener.java
Use the Spring Initializr

@Component
public class JobCompletionNotificationListener extends JobExecutionListenerSupport {

	private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);

	private final JdbcTemplate jdbcTemplate;

	@Autowired
	public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	@Override
	public void afterJob(JobExecution jobExecution) {
		if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
			log.info("!!! JOB FINISHED! Time to verify the results");

			jdbcTemplate.query("SELECT first_name, last_name FROM people",
				(rs, row) -> new Person(
					rs.getString(1),
					rs.getString(2))
			).forEach(person -> log.info("Found <" + person + "> in the database."));
		}
	}
}

Model

배포 관리를 통해 job실행 / jobLauncher를 실행> jobRespository > @Scheduled 어노테이션으로 예약된 Quartz cron 시간 이벤트 발생 > 해당하는 job /Configuration Step 에 따라 순차 처리

Cron Job list는 프로퍼티로 세팅, 배포 없이 사용유무 관리를 위해서 DB 유효성 체크 서비스를 추가하는 것이 보편적인 비지니스 모델인 것 같다

진행

1차 요청 : 스프링 배치 프로젝트 init 구성 > 푸쉬 메시지 관리 sample job
220208~220209
ㄴ 스프링 배치 프로젝트 init 구성
ㄴ Cron job 실행 완료 (DB 연결/확장 제외)
220211
ㄴ AWS ec2 설치된 DB로 ssh 세션 터널링 연결
ㄴ MyslqDbConfig 설정 추가

+

왜 스프링 배치를 사용하는지 / 어떠한 문제를 해결할 수 있는지
멱등성은 어떻게 유지하는가? 데이터 전후 처리를 어떻게 판단하고 관리하였는가
중간 과정에서 에러, 실패 처리는 어떻게 하였는가
multi Thread <> partioning 처리 / 운영 방식
트랜지션 Chunk 단위로 관리하는 이유?
tasket model vs model /processor / writer ?
curson <> page 기반 클래스
배치 실행 / 구동은 어떻게 하였는지
배치 잡 모니터링 관리는 어떻게 하였는지 / 지연관리

참고 자료

https://okdevtv.com/mib/spring/batch
https://spring.io/guides/gs/batch-processing/
https://docs.spring.io/spring-batch/docs/current/reference/html/spring-batch-intro.html#spring-batch-intro

0개의 댓글