package com.system.batch;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class EmailProvider {
public void send(String to, String subject, String message) {
// 실제로는 여기서 SMTP로 메일 발송
log.info("[메일 발송 성공] 받는사람: {}", to);
log.info("제목: {}", subject);
log.info("내용: {}", message);
}
}
✅ 2. 리스너에서 메일 서비스 호출하기
JobReportListener.java
package com.system.batch;
@Slf4j
@Component
@RequiredArgsConstructor
public class JobReportListener {
private final EmailProvider emailProvider;
@BeforeJob
public void before(JobExecution jobExecution) {
log.info("배치를 시작합니다. (Job ID: {})", jobExecution.getJobInstanceId());
}
@AfterJob
public void after(JobExecution jobExecution) {
// Job이 실패했는지 확인
if (jobExecution.getStatus() == BatchStatus.FAILED) {
//실패 시 메일 발송
emailProvider.send(
"admin@mycompany.com",
"배치 실패 알림",
"Job ID " + jobExecution.getJobInstanceId() + "번이 실패했습니다. 확인 바람!"
);
} else {
log.info("배치가 성공적으로 끝났습니다.");
}
}
}
✅ 3. Configuration에 등록하기
EmailListenerConfig.java
package com.system.batch;
@Slf4j
@Configuration
@RequiredArgsConstructor
public class EmailListenerConfig {
private final JobRepository jobRepository;
private final PlatformTransactionManager transactionManager;
private final JobReportListener jobReportListener; // 우리가 만든 리스너 주입
@Bean
public Job emailJob() {
return new JobBuilder("emailJob", jobRepository)
.start(exampleStep())
.listener(jobReportListener) // 리스너 장착
.build();
}
@Bean
public Step exampleStep() {
return new StepBuilder("exampleStep", jobRepository)
.tasklet((contribution, chunkContext) -> {
log.info("3초 뒤에 에러를 발생시킵니다...");
Thread.sleep(3000);
// 여기서 강제로 예외(Exception)를 던져서 배치를 실패시키기
throw new RuntimeException("테스트를 위해 일부러 에러를 발생!");
}, transactionManager)
.build();
}
}
✅ 4. 실행결과 확인하기
# 각 운영체제에 맞는 명령문으로 배치 실행
./gradlew bootRun --args='--spring.batch.job.name=emailJob'