2021-01-13 sp7

jsbak·2021년 1월 13일
0

Spring

목록 보기
5/7

오늘 배운 부분 그 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
위 링크 내용과 비교해보기

  1. 1초 마다라는 스케줄 설정(작업이 아니다. 외부로 빠진다.) - Timer
  2. 1초마다 작업 수행시 메인스레드에는 영향을 주지 않는 별개의 스레드, 일정 갯수의 스레드(풀링-polling) - 스레드풀익스큐스터?


각각 스레드풀 이스큐스터, 타이머

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

검색어 : quartz framework
링크 : http://www.quartz-scheduler.org/
스케줄러 - 타이머의 역할을 좀 더 확대하였다.

pom.xml 추가

1버전대 쓰려면 이것과 연동해야한다.

작업에 대한 정의


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 자동 의존 관계 형성?

Wiring up jobs using triggers and the SchedulerFactoryBean

트리거 등록하기

두가지 분리 설정
1. 작업을 정의하는 Trigger (작업의 시점?, 이벤트 발생)
- 실행이라는 관정을 만들어줌
- 이 트리거가 동작하게 해주는게 스케줄러?
2.

어떤 작업을 실행할지 simple, cron 방식

<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가지 문제점??

  • PNQJB가 spring에서 관리되는게 아닌 quartz에서 관리되고있음
  • quarz-context.xml: 이건어떤문제점이었지
  • extends QuarzJobBean : quartz없이 운영할수 없는 quartz종속적인 non-pojo객체가되버림

34.6.2 Using the MethodInvokingJobDetailFactoryBean

작업이 메서드로 하느냐 인스턴스 대상으로 하는가가 차이

<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="exampleBusinessObject"/>
    <property name="targetMethod" value="doIt"/>
</bean>

작업 종료시 알림에 대한 설정 추가?

리스너로 처리(이벤트 처리)

리스너가 가지고 있는 메서드를 보면 처리할 수 있는 이벤트 종류를 알 수 있다.

Quartz - 탈퇴처리

제대로하면 관련된 녀석들을 프로시저를 만들어서 처리해야한다.

절차적으로 쿼리를 짜서 하려면
프로시저나 함수를 만들어야한다. 차이 리턴값 여부
함수는 쿼리구문 안에서 실행해야한다.

프로시저를 만들어서 mybatis 에서 사용, 일주일마다 월요일 03:00 에 실행

일주일마다 일정을 수행하려면
스케줄러가 필요하다. 또한 작업의 어떤 문제 확인 등을 하려면 콰츠가 필요하다.
그러면 콰츠 Detail 이 필요하고 콰츠의 설정이 필요하다.

배치 작업은 웹하고 연관이 없어서 주로 상위 에서 처리한다( 어디든 상관없지만)

Spring Batch

참고 : https://spring.io/guides/gs/batch-processing/
Java Config방식, Spring Boot 방식

4점대는 스프링 5점대와 연동되는것 그래서 우리는 3점대 마지막 것을 이용

주로 대용량 데이터를 바탕으로하고 있을때 이것을 이용한다.

한전 고지서 발부

  1. 수집된 사용량을 바탕으로 요금계산
  2. 20일날 고지서 발부
    이럴때 이용하는 것이 배치워크이다.

전체 단위 : 잡
잡안의 세부적인 것
소 단위 : 스탭
1:M 관계 (연관)


Reader 배치값 읽기
Processor 배치값 계산
Writer 배치값 저장

고지서 폼을 만드는 것 프로세스
메일, 문자 발송, DB에 저장 Writer

Step 은 항상 위의 3가지가 한 세트로 움직인다.

JobLauncher

하나로 묶어서 하나의 일괄 처리 작업으로 이뤄지는데 이 실행하는 녀석

Chunk

처리 묶음의 단위

JobRepository

Job 실행 정보 저장소. jobInstance, jobExecution, stepExecution, 및 각 context를 저
장함

GettingStarted

하나의 스탭
읽기, 대문자로 변경, 저장


인베디드 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 파싱

Create an Intermediate Processor

Create an Intermediate Processor

트랜잭션 관리자가 필요하다.

JobCompletionNotificationListener

profile
끄적끄적 쓰는곳

0개의 댓글