본문 바로가기
Study/스프링배치 완벽 가이드

Day 5. 잡 리스너 이해하기

반응형
스프링 배치 완벽 가이드 내용 정리입니다
3장. 예제 잡 어플리케이션은 스킵했습니다

 

http://www.yes24.com/Product/Goods/99422216

 

스프링 배치 완벽 가이드 2/e - YES24

스프링 배치의 `Hello, World!`부터 최근 플랫폼의 발전에 따른 클라우드 네이티브 기술을 활용한 배치까지 폭넓은 스프링 배치 활용 방법과 이와 관련된 유용한 내용을 다룬다. 또한 스프링 프레임

www.yes24.com


1. 잡 리스너

  • 모든 잡은 생명주기를 갖는다
  • 스프링 배치는 생명주기의 여러 시점에 로직을 추가할 수 있는 기능을 제공한다
  • 잡 실행과 관련이 있다면 JobExecutionListener를 사용할 수 있다
  • JobExecutionListener
    • 해당 인터페이스는 beforeJobafterJob의 두 메서드를 제공한다
    • beforeJob 메서드를 이용해 잡 실행전에 준비해둬야할 것이 있으면 해당 로직을 실행하면 좋다
    • afterJob 메서드를 이용해 잡의 성공과 실패의 영향을 미치지는 않은 배치 완료후 정리 작업을 하기 좋다
  • 작성하는 방법 1
    • org.springframeowork.batch.core.JobExecutionListener 인터페이스를 구현
      • 위에서 말한대로 beforeJob과 afterJob 두 메서드를 가지고 있다
      • 각각은 JobExecution을 파라미터로 전달받아 실행되며 각각 잡을 실행하기 전, 잡을 실행된 후에 실행된다
      • afterJob 메서드는 잡의 완료 상태와 관계없이 호출된다
    • JobExecutionListener 작성
      // JobLoggerListener.java
      public class JobLoggerListener implements JobExecutionListener {
      
          private static final String START_MESSAGE = "%s is beginning execution";
          private static final String END_MESSAGE = "%s has completed with the status %s";
      
          @Override
          public void beforeJob(JobExecution jobExecution) {
              System.out.println(String.format(START_MESSAGE, jobExecution.getJobInstance().getJobName()));
          }
      
          @Override
          public void afterJob(JobExecution jobExecution) {
              System.out.println(String.format(END_MESSAGE,
                      jobExecution.getJobInstance().getJobName(),
                      jobExecution.getStatus()));
          }
      }​
    • Job 작성
      // JobLoggerListenerBatch.java
      @RequiredArgsConstructor
      @Configuration
      public class JobLoggerListenerBatch {
      
          private static final String JOB_NAME = "jobLoggerListenerBatchJob";
          private static final String STEP_NAME = "jobLoggerListenerBatchStep";
      
          private final JobBuilderFactory jobBuilderFactory;
          private final StepBuilderFactory stepBuilderFactory;
      
      
          @Bean(JOB_NAME)
          public Job jobLoggerListenerBatchJob() {
              return this.jobBuilderFactory.get(JOB_NAME)
                      .start(jobLoggerListenerBatchStep())
                      .incrementer(new RunIdIncrementer())
                      .listener(new JobLoggerListener())
                      .build();
          }
      
      
          @Bean(STEP_NAME)
          public Step jobLoggerListenerBatchStep() {
              return this.stepBuilderFactory.get(STEP_NAME)
                      .tasklet((contribution, chunkContext) -> {
                          System.out.println("tasklet execute");
                          return RepeatStatus.FINISHED;
                      })
                      .build();
          }
      
      }​
    • 실행 결과
      // result
      2021-11-26 00:19:15.899  INFO 8035 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=jobLoggerListenerBatchJob]] launched with the following parameters: [{run.id=1}]
      jobLoggerListenerBatchJob is beginning execution
      2021-11-26 00:19:15.927  INFO 8035 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [jobLoggerListenerBatchStep]
      tasklet execute
      2021-11-26 00:19:15.943  INFO 8035 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [jobLoggerListenerBatchStep] executed in 16ms
      jobLoggerListenerBatchJob has completed with the status COMPLETED​
  • 작성하는 방법 2
    • JobExecutionListner를 구현하지 않고 @BeforeJob, @AfterJob 어노테이션을 사용해 작성할 수 있다
    • beforeJob, afterJob 메서드를 똑같이 구현하되 @BeforeJob, @AfterJob 어노테이션을 붙여준다
    • JobListenerFactoryBeangetListener 메서드를 통해 래핑해줘야 사용이 가능하다

 

728x90
반응형

'Study > 스프링배치 완벽 가이드' 카테고리의 다른 글

Day 6. ExecutionContext  (0) 2021.12.26
Day 4. 잡 파라미터 이해하기  (0) 2021.11.25
Day 3. 잡과 스텝 이해하기  (0) 2021.11.06
Day 2. 스프링 배치  (0) 2021.11.05
Day 1. 배치와 스프링  (0) 2021.11.01