JobLauncher사용시 RunIdIncrementer적용하기

freddie·2021년 4월 16일
0

Spring-batch

목록 보기
3/4

문제상황

batch 실행시 처리해주고 싶은 내용이 있어서 ApplicationRunner를 통해서 배치 job을 실행하려고 했다.

spring.batch.job.enabled=false를 설정해서 배치가 자동으로 실행되지 않도록 한 뒤, ApplicationRunner를 직접 구현했다.

직접 jobLauncher와 JobParametersBuilder를 사용했는데 실행해보니 문제가 있었다.
동일한 파라미터로 배치를 실행하기 위해서 RunIdIncrementer를 사용했는데, 실제로 로그를 보면 run.id가 설정이 안된것이다.

TimeStampBatchConfiguration

@Configuration
class TimeStampBatchConfiguration(
    private val jobBuilderFactory: JobBuilderFactory,
    private val stepBuilderFactory: StepBuilderFactory
) {
    @Bean
    fun timeStampJob(printTimeStampJob: Step): Job {
        return jobBuilderFactory.get("timestamp-job")
            .incrementer(RunIdIncrementer())
            .start(printTimeStampJob)
            .build()
    }

    @Bean
    fun printTimeStampJob(): Step {
        return stepBuilderFactory.get("print-timestamp-step")
            .tasklet { contribution, chunkContext ->
                println(System.currentTimeMillis())
                RepeatStatus.FINISHED
            }
            .build()
    }
}

실행결과

2021-04-17 00:05:31.095  INFO 92219 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=timestamp-job]] launched with the following parameters: [{}]
2021-04-17 00:05:31.123  INFO 92219 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [print-timestamp-step]
1618585531130
2021-04-17 00:05:31.136  INFO 92219 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [print-timestamp-step] executed in 12ms
2021-04-17 00:05:31.139  INFO 92219 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=timestamp-job]] completed with the following parameters: [{}] and the following status: [COMPLETED] in 27ms

원인

RunIdIncrementer가 어떻게 동작하는지 알아봐야했다.
spring.batch.job.enabled=true인 경우는 잘 동작했기 때문에 어디서 run.id값을 설정해주는지 궁금했다.

자동으로 설정된 JobLauncherCommandLineRunner가 실행시에 Job에 설정한 JobParametersIncrementer를 사용해서 설정해주고 있었다.

Job을 설정하는 과정에서 RunIdIncrementer를 설정했기 때문에 내부에서 사용하는줄 알았는데, 런처 실행할때 속성을 참고해서 넣어줘야 하는 구조라니..

해결

직접 실행하는 런처의 파라미터 설정 부분도 비슷하게 만들어주었다.
jobExplorer@EnableBatchProcessing설정을 통해 Bean생성이 되어있었기 때문에 간단히 주입받아서 해결했다.

@Bean
fun runner() = ApplicationRunner {
    jobLauncher.run(
        timeStampJob, JobParametersBuilder(jobExplorer)
            .getNextJobParameters(timeStampJob)
            .toJobParameters()
    )
}

실행결과

2021-04-17 00:18:53.687  INFO 93210 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=timestamp-job]] launched with the following parameters: [{run.id=1}]
2021-04-17 00:18:53.714  INFO 93210 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [print-timestamp-step]
1618586333723
2021-04-17 00:18:53.730  INFO 93210 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [print-timestamp-step] executed in 15ms
2021-04-17 00:18:53.734  INFO 93210 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=timestamp-job]] completed with the following parameters: [{run.id=1}] and the following status: [COMPLETED] in 30ms

예제코드

profile
하루에 하나씩만 배워보자

0개의 댓글