[Batch] Spring batch Job API 호출

2024. 6. 27. 17:54Spring

 

Spring batch 서버에서 Job을 API로 호출하는 방법을 정리했습니다.

 

사용범위

  • 환경 별 API 호출을 통한 통합 테스트
    • 대부분 배치서버는 외부 호출을 막고 있기 때문에 로컬테스트 용도로 사용
    • 외부호출이 가능하거나 인스턴스 접근이 가능하면 curl 등으로 호출

 

Config 구성

  • Job parameter
    • JobBuilderFactory
    • JobMemberExecutionListener
      • JobExecutionListener 구현체를 만들어 사용해야한다.
    • JobParameterIncrement
      • API 호출 시 회원별 분기 처리
      • 같은 회원 중복 호출 시 고유값이 중복으로 들어오면 에러발생
        • 같은 파라미터로 배치를 중복생성 할 수 없음
    • Step
@Slf4j
@RequiredArgsConstructor
@Configuration
public class memberBatchConfig extends CommonAggregateConfig {
    public static final String JOB_NAME = "memberTestBatch";
    public static final String JOB_NAME_KR = "회원 테스트 배치";
    private static final int CHUNK_SIZE = 1000;
    private static final int FETCH_SIZE = 100;
    
    @Autowired
	protected JobBuilderFactory jobBuilderFactory;

	@Autowired
	protected StepBuilderFactory stepBuilderFactory;
    
    @Qualifier("testEntityManagerFactory")
	@Autowired
	protected EntityManagerFactory entityManagerFactory;


    @Bean(JOB_NAME)
    public Job memberBatchJob(JobBuilderFactory jobBuilderFactory, JobMemberExecutionListener jobExecutionListener,
                                        JobParameterIncrement jobParameterIncrement, @Qualifier(JOB_NAME + "Step") Step step) {
        return jobBuilderFactory.get(JOB_NAME)
            .incrementer(jobParameterIncrement)
            .start(step)
            .build();
    }

    @Bean(JOB_NAME + "Step")
    @JobScope
    public Step memberBatchStep(StepBuilderFactory stepBuilderFactory){
        return stepBuilderFactory.get(JOB_NAME.concat("-STEP"))
              .<Member, Member>chunk(CHUNK_SIZE)
                .reader(reader())
                .writer(writer())
              .build();
    }

    @Bean(JOB_NAME + "-Step-Reader")
    @StepScope
    public ItemReader<Member> reader() {
        // reader()
    }
    
    
    @Bean(JOB_NAME + "-Step-Writer")
    @StepScope
    public ItemWriter<Member> writer() {
		// writer()
    }
}

 

 

Controller

@Slf4j
@RestController
@RequestMapping(value = "/batch/member/test")
public class MemberLaunchController {
    @Autowired
    private JobLauncher jobLauncher;

    @Autowired
    @Qualifier("memberTestBatch") //Job name
    private Job memberJob;


    @GetMapping("/launch")
    @ResponseStatus(HttpStatus.OK)
    public Void jobLauncher() throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
       jobLauncher.run(memberJob, new JobParametersBuilder()
             .addString("jobNameKr", MemberConfig.JOB_NAME_KR)
             .addString("timestamp", LocalDateTime.now().toString()) // 유니크한 파라미터 추가, 중복 실행을 위함
             .addString("회원id 및 번호")
             .toJobParameters());
		return;
    }
}