목차

Spring Framework Batch

@EnableBatchProcessing

DefaultBatchConfigurer

JobRepository

Migration

Transaction 설정

Connection Pool 설정

트랜잭션 매니저를 지정하지 않으면

TransactionManager를 지정하지 않으면 다음과 같은 오류가 발생한다.

java.lang.IllegalStateException: To use the default BatchConfigurer the context must contain precisely one DataSource, found X

트랜잭션 기본 설정 및 트랜잭션 없이 실행하기

TransactionManager 를 ResourcelessTransactionManager 로 지정하면 된다.

혹은 아래와 같이 propagation=“NEVER”로 지정한다.

<batch:job id="jobid">
    <batch:step id="step1">
        <batch:tasklet ref="taskletId" transaction-manager="transactionManager">
            <batch:transaction-attributes propagation="NEVER"/>
        </batch:tasklet>
    </batch:step>
</batch:job>

Java Config

@Bean
@JobScope
public Step myStep(@Value("#{jobParameters[date]}" String date, 
    @Value("#{jobParameters[count]}") long count) {
    // ...
}

Chunk 사이즈가 크고 Transaction 이 긴데, 외부에 write 대상건을 알려주는 경우 DB Lock 발생할 수 있음

JobInstanceAlreadyCompleteException: A job instance already exists and is complete for parameters 오류 발생

jobBuilderFactory.get("myJobName")
            .start(step())
            . .....
            .incrementer(new RunIdIncrementer())
            .build();

RunIdIncrementer 사용시 기존 파라미터가 현재 파라미터 지정한 것을 덮어씀

/**
 * 파라미터를 복사하지 않는 RunIdIncrementer
 */
public class ParamCleanRunIdIncrementer implements JobParametersIncrementer {
    private static String RUN_ID_KEY = "run.id";
    private String key = RUN_ID_KEY;
 
    public void setKey(String key) { this.key = key; }
 
    @Override
    public JobParameters getNext(JobParameters parameters) {
        JobParameters params = (parameters == null) ? new JobParameters() : parameters;
        long id = params.getLong(key, 0L) + 1;
        return new JobParametersBuilder().addLong(key, id).toJobParameters(); // 이부분이 RunIdIncrementer와 다르다.
    }
}

Java Config Spring Bean 설정시 리턴 타입을 인터페이스가 아닌 구현 클래스로 지정할 것.

o.s.b.c.l.AbstractListenerFactoryBean : org.springframework.batch.item.ItemReader is an interface. The implementing class will not be queried for annotation based listener configurations. If using @StepScope on a @Bean method, be sure to return the implementing class so listner annotations can be used.
org.springframework.batch.item.ItemReader는 인터페이스입니다. 구현 클래스는 어노테이션 기반 listener 구성에 대해 실행되지 않습니다. @Bean 메소드에서 @StepScope를 사용하는 경우 listner 어노테이션을 사용할 수 있도록 구현 클래스를 리턴해야합니다.

Test

참고