인프런 커뮤니티 질문&답변

jinseok님의 프로필 이미지
jinseok

작성한 질문수

스프링 배치

processor 분기 처리

작성

·

284

·

수정됨

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);

답변 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

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

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

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

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

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

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

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

jinseok님의 프로필 이미지
jinseok

작성한 질문수

질문하기