티스토리 뷰

지난 글에서 다뤘던 Springboot Batch Chunk Example에서 소스들을 살펴 볼때 Listener도 살짝 나왔다. 우리가 정의한 Job이나 Step 실행 전 후로 필요한 공통 작업을 기술하기 위해 주로 사용되며 사용된다. 

 

spring batch listener

이전에 사용했던 그림에 추가적으로 listener를 붙여봤다. 조악하기 그지 없다. listener 자체가 이해하기 그렇게 어려운 개념은 아니기에 이정도 그림이면 이해를 할것이라고 생각한다.. 


Job Listener

Job의 실행 전후에 처리해야 할 일이 있을때 작성을 한다. 사용방법은 다음과 같다. 

@Bean
public Job sampleChunkJob(SampleJobListener jobListener, Step sampleChunkStep) {
    return jobBuilderFactory.get("sampleChunkJob")
        .incrementer(new RunIdIncrementer())
        .listener(jobListener)
        .flow(sampleChunkStep)
        .end()
        .build();
}

Job에 listener를 껴 넣었다. 추가할 listener가 없다면 기술하지 않으면 된다. 추가를 하고 싶다면 작성한 Job Listener를 parameter에 넣어주면 된다. 

 

SampleJobListener.java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.listener.JobExecutionListenerSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

@Component
public class SampleJobListener extends JobExecutionListenerSupport {

    private static final Logger log = LoggerFactory.getLogger(SampleJobListener.class);

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public SampleJobListener(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    
    @Override
    public void beforeJob(JobExecution jobExecution) {
        if(jobExecution.getStatus() == BatchStatus.STARTED) {
            log.info("chunkJob start! ");
        }
    }
    
    @Override
    public void afterJob(JobExecution jobExecution) {
        
        /*
        jdbcTemplate.query("SELECT * FROM employee",
                (rs, row) -> new Employee(
                    rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4), rs.getString(5), rs.getString(6),
                     rs.getString(7), rs.getString(8), rs.getString(9), rs.getString(10), rs.getString(11), rs.getString(12)
                    )
            ).forEach(employee -> log.info("###" + employee.getFirst_name() + " " + employee.getLast_name() + " in hsql database."));
        */
        
        if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
            log.info("chunkJob successed! ");
        } else if (jobExecution.getStatus() == BatchStatus.FAILED) {
            log.info("chunkJob failed! ");
        }
    }
}

Job Listener를 작성할때는 기본적으로 JobExecutionListenerSupport를 extends 받아서 작성하며 beforeJob과 afterJob을 오버라이드하여 사용할 수 있다. 꼭 필요가 있는 작업만 오버라이드해서 사용하면 된다. 또한 parameter인 jobExecution를 통해서 필요한 값을 가지고 올 수 있다. 


Step Listener

Step의 실행 전후에 처리해야 할 일이 있을때 작성을 한다. 사용방법은 다음과 같다. 

@Bean
public Step sampleChunkStep(SampleStepListener stepListener, JdbcBatchItemWriter<Employee> writer) {
    return stepBuilderFactory.get("sampleChunkStep")
        .listener(stepListener)
        .<Employee, Employee> chunk(10)
        .reader(reader())
        .processor(processor())
        .writer(writer)
        .build();
}

Step에 listener를 껴 넣었다. 추가할 listener가 없다면 기술하지 않으면 된다. 추가를 하고 싶다면 작성한 Step Listener를 parameter에 넣어주면 된다. 

SampleStepListener.java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.listener.StepExecutionListenerSupport;
import org.springframework.stereotype.Component;

@Component
public class SampleStepListener extends StepExecutionListenerSupport {

    private static final Logger log = LoggerFactory.getLogger(SampleStepListener.class);

    @Override
    public void beforeStep(StepExecution stepExecution) {
        if(stepExecution.getStatus() == BatchStatus.STARTED) {
            log.info("chunkStep start!");
        }
    }
    
    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        if(stepExecution.getStatus() == BatchStatus.COMPLETED) {
            log.info("chunkStep end");
        }
        return new ExitStatus("stepListener exit");
    }
}

Job Listener를 작성할때는 기본적으로 StepExecutionListenerSupport를 extends 받아서 작성하며 beforeStep과 afterStep을 오버라이드하여 사용할 수 있다. 꼭 필요가 있는 작업만 오버라이드해서 사용하면 된다. 또한 parameter인 stepExecution를 통해서 필요한 값을 가지고 올 수 있다.

 

Job Listener와 Step Listener를 사용하는데 큰 어려움은 없을 것으로 생각된다. 실행을 해보자. 

 

job launch >  job listener start > step listener start > step listener end > job listener end > job finish

 

이런 흐름으로 실행이 된다. 어렵지 않다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31