오늘 배운 부분 그 datasource-context, batch-context 에러 확인하기 Spring 배치 부분
스케줄러 와 스레드풀 어떤식으로 프레임워크 안에서 적용되는지 본다.
참고 : https://docs.spring.io/spring-framework/docs/4.3.29.RELEASE/spring-framework-reference/html/scheduling.html#scheduling-task-scheduler
위 링크 내용과 비교해보기
각각 스레드풀 이스큐스터, 타이머
Cron 표현식
"0 0 * * * " 매시 정각
"/10 * * * * " 10초마다
"0 0 8-10 * " 8~10시 정각 마다
"0 0 6,19 * *" 6, 19시
Cron 표현식을 다양한 설정이 가능하기 떄문에 디테일한 설정이 가능하다.
"0 0 9-17 * * MON-FRI" 9~17 에 월요일~금요일
검색어 : quartz framework
링크 : http://www.quartz-scheduler.org/
스케줄러 - 타이머의 역할을 좀 더 확대하였다.
pom.xml 추가
Bean 등록
<bean name="exampleJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="example.ExampleJob"/>
<property name="jobDataAsMap">
<map>
<entry key="timeout" value="5"/>
</map>
</property>
</bean>
FactoryBean ? name(=id)
package example;
public class ExampleJob extends QuartzJobBean {
private int timeout;
/**
* Setter called after the ExampleJob is instantiated
* with the value from the JobDetailFactoryBean (5)
*/
public void setTimeout(int timeout) {
this.timeout = timeout;
}
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {
// do the actual work
}
}
@autowire 자동 의존 관계 형성?
트리거 등록하기
두가지 분리 설정
1. 작업을 정의하는 Trigger (작업의 시점?, 이벤트 발생)
- 실행이라는 관정을 만들어줌
- 이 트리거가 동작하게 해주는게 스케줄러?
2.
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- see the example of method invoking job above -->
<property name="jobDetail" ref="jobDetail"/>
<!-- 10 seconds -->
<property name="startDelay" value="10000"/>
<!-- repeat every 50 seconds -->
<!-- fixed Rate-->
<property name="repeatInterval" value="50000"/>
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="exampleJob"/>
<!-- run every morning at 6 AM -->
<property name="cronExpression" value="0 0 6 * * ?"/>
</bean>
추가 tx 필요하다
실행시 싱글턴이 아니다.
3가지 문제점??
작업이 메서드로 하느냐 인스턴스 대상으로 하는가가 차이
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="exampleBusinessObject"/>
<property name="targetMethod" value="doIt"/>
</bean>
리스너로 처리(이벤트 처리)
리스너가 가지고 있는 메서드를 보면 처리할 수 있는 이벤트 종류를 알 수 있다.
제대로하면 관련된 녀석들을 프로시저를 만들어서 처리해야한다.
절차적으로 쿼리를 짜서 하려면
프로시저나 함수를 만들어야한다. 차이 리턴값 여부
함수는 쿼리구문 안에서 실행해야한다.
프로시저를 만들어서 mybatis 에서 사용, 일주일마다 월요일 03:00 에 실행
일주일마다 일정을 수행하려면
스케줄러가 필요하다. 또한 작업의 어떤 문제 확인 등을 하려면 콰츠가 필요하다.
그러면 콰츠 Detail 이 필요하고 콰츠의 설정이 필요하다.
배치 작업은 웹하고 연관이 없어서 주로 상위 에서 처리한다( 어디든 상관없지만)
참고 : https://spring.io/guides/gs/batch-processing/
Java Config방식, Spring Boot 방식
4점대는 스프링 5점대와 연동되는것 그래서 우리는 3점대 마지막 것을 이용
주로 대용량 데이터를 바탕으로하고 있을때 이것을 이용한다.
전체 단위 : 잡
잡안의 세부적인 것
소 단위 : 스탭
1:M 관계 (연관)
Reader 배치값 읽기
Processor 배치값 계산
Writer 배치값 저장
고지서 폼을 만드는 것 프로세스
메일, 문자 발송, DB에 저장 Writer
Step 은 항상 위의 3가지가 한 세트로 움직인다.
하나로 묶어서 하나의 일괄 처리 작업으로 이뤄지는데 이 실행하는 녀석
처리 묶음의 단위
Job 실행 정보 저장소. jobInstance, jobExecution, stepExecution, 및 각 context를 저
장함
하나의 스탭
읽기, 대문자로 변경, 저장
인베디드 DB
의존성 추가
person Class 카피
package com.example.batchprocessing;
public class Person {
private String lastName;
private String firstName;
public Person() {
}
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "firstName: " + firstName + ", lastName: " + lastName;
}
}
sample-data
csv는
',' 가 분리자 역할을 한다. (토큰)
Jill,Doe
Joe,Doe
Justin,Doe
Jane,Doe
John,Doe
한줄을 읽어서
Jill,Doe 파싱
트랜잭션 관리자가 필요하다.