inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 배치

processor 분기 처리

373

jinseok

작성한 질문수 1

0

안녕하세요 강의 도움이 많이되고 있어 감사말씀드립니다.

제가 FCM을 사용한 그룹 알림 발송 배치 API 를 개발 중에 있습니다.

 

processor 에서 그룹에 속한 알림에 대해서 fcm 전송을 하는데 trcy catch 로

성공일 경우 알림성공 업데이트를 위한 객체를 생성하고

실패일 경우 알림실패 업데이트를 위한 객체 따로따로 생성하고 있습니다.

그 다음으로 writer 로 던집니다.

 

문제는 stepListener 에서 총 몇개에서 총 몇건 전송했고, 성공, 실패 로깅하는 방법을 모르겠습니다.

또 stepListener 에서 모두 다 실패했으면 알림 그룹의 상태 값을 전송 실패 그 외 성공으로 변경하는 로직이 있습니다.

 

추가 +

일단 StepSynchronizationManager 를 사용해서 ExecutionContext 에 저장해서 stepListener 에서

아래와 같이 사용하고 있습니다. 올바르게 사용한건지 궁금합니다.

int successCount = 
stepExecution.getExecutionContext().getInt("successCount", 0); 
int failureCount = 
stepExecution.getExecutionContext().getInt("failureCount", 0);

spring-boot spring-batch

답변 2

0

정수원

배치에서 실시간적으로 어떤 값을 저장하는 유형은 두가지가 있습니다.

하나는 JobExecution 에 포함된 ExecutionContext 와 StepExecution 에 포함된 ExecutionContext 입니다.

그리고 Listener 를 통해서 각 ExecutionContext 에 담긴 값을 참조할 수 있습니다.

여기서 Step 의 ExecutionContext 은 Step 간에 공유할 수 없고 동일한 Step 에서만 참조가능하며 Step 간에 ExecutionContext 를 공유하기 위해서는 Job 의 ExecutionContext 를 사용해서 참조해야 합니다.

즉 stepExecution.getJobExecution().ExecutionContext() 와 같이 사용하실 수 있습니다.

ExecutionContext 은 Map 처럼 사용할 수 있고 리스너에서 Step 을 참조할 수 있으면 어디든 접근이 가능합니다.

총 몇개에서 총 몇 건 전송했고, 성공, 실패 로깅하는 것은 Step 의 처리에서 ExecutionContext 에 각 항목을 저장하게 되면 디비에 저장되고 리스너에서 불러 올 수 있습니다.

ExecutionContext jobExecutionContext = stepContribution.getStepExecution() .getJobExecution().getExecutionContext();

jobExecutionContext.put("key", "value");

 

ExecutionContext stepExecutionContext = stepContribution.getStepExecution() .getExecutionContext();

stepExecutionContext .put("key", "value");

 

Tasklet 을 처리하는 메서드에서 위의 코드처럼 ExecutionContext 를 사용해서 저장하고 리스너에서

int successCount = stepExecution.getExecutionContext().getInt("successCount", 0);

int failureCount = stepExecution.getExecutionContext().getInt("failureCount", 0);

 

처럼 사용하시면 됩니다.

 

0

인프런 AI 인턴

안녕하세요 jinseok 님, 인프런 AI 인턴이에요.

stepListener에서 총 전송 건수와 성공, 실패 로깅하는 방법에 대해 궁금하신 것 같아요.

일단, stepListener에서 전송 건수와 성공/실패 로깅을 위해 ExecutionContext를 사용하신 것은 올바른 방법이에요.
따라서, 아래와 같이 ExecutionContext를 활용하여 건수를 조회하실 수 있습니다.

int successCount = stepExecution.getExecutionContext().getInt("successCount", 0);
int failureCount = stepExecution.getExecutionContext().getInt("failureCount", 0);

여기서 주의해야 할 점은, 객체 생성 단계에서 ExecutionContext를 초기화해야 한다는 점입니다.
즉, 성공/실패 업데이트를 위해 객체를 생성하기 전에 stepExecution.getExecutionContext()를 사용하여 건수를 초기화해야 합니다.

또한, 모든 알림 전송이 실패할 경우에는 stepListener에서 알림 그룹의 상태 값을 변경하는 로직을 추가하실 수 있습니다.
이는 알림 그룹의 상태 값을 저장하고 있는 변수를 사용하여, 실패일 경우에 해당 변수 값을 변경하면 됩니다.

위의 내용들을 참고하여 작업해보세요. 추가로 궁금한 내용이 있으면 언제든지 물어보세요! 감사합니다.

스프링 배치 버전 질문

0

122

1

소스코드가 어디에 있나요?

0

96

2

트랜잭션 예외

0

92

1

질문이 있습니다.

0

130

2

ChunkListener 에서 beforeChunk 의 실행 시점 관련 질문

0

125

2

여러 JOB 설정하는법

0

150

2

강의 자료 다른 방법 있을까요?

0

154

1

JobExecution과 JobExecutionContext와의 관계

0

186

2

특정 job만 실행

1

252

1

Batch 성능 질문

0

153

1

ItemReaderAdapter 종료

0

80

1

[ 강좌 Git 브랜치 문의 ] 섹션 9 > JdbcCursorItemReader, JpaCursorItemReader

0

179

2

Spring Batch 배포 질문

0

246

2

spring batch 버전

0

236

2

retry count 관련 질문

0

172

2

StepExecutionListener 의 afterStep 에서 return ExitStatus.FAILED 에 의한 동작에 의문이 갑니다.

0

330

2

jdbc, jpa 커서방식 조회 방식 차이 질문 (강사님께 답변 받고 싶습니다)

0

235

2

Multithread step과 AsyncItemProcessor

0

203

2

job 재실행

0

251

2

bean 생명주기 문제 도와주세요(@Scope("step"), @Autowired)

0

183

1

Multi-threaded-step과 Partitioning 차이 확인

0

175

2

jdbcCursorReader, jdbcPagingReader 질문

0

146

1

step muti-thread 질문

0

111

1

itemSteam open update close 질문

0

112

1