multicast() 메소드를 사용해서 여러 사용자에게 푸시 알림을 전송하는 로직에서 오류 발생. .
// (마케팅 수신동의한 멤버) 전체 알림 전송
public void sendBulkMarketingNotification(MessagePushRequest request) {
List<Long> agreedMembers = consentService.findAllMarketingAgreedMember();
List<String> targetTokens = fcmTokenRepository.findTokensByMemberIds(agreedMembers);
// 토큰이 없을 경우 처리
if (targetTokens.isEmpty()) {
System.out.println("No target tokens found for marketing agreed members.");
return; // 토큰이 없으면 조기 리턴
}
// Notification 객체를 Builder를 통해 생성
Notification notification = Notification.builder()
.setTitle(request.title())
.setBody(request.body())
.build();
// MulticastMessage를 만들기 위해 토큰을 500개씩 나누기
int batchSize = 500;
for (int i = 0; i < targetTokens.size(); i += batchSize) {
// 500개씩 서브리스트 생성
List<String> tokensBatch = targetTokens.subList(i, Math.min(i + batchSize, targetTokens.size()));
// MulticastMessage 객체 생성
MulticastMessage multicastMessage = MulticastMessage.builder()
.setNotification(notification)
.addAllTokens(tokensBatch)
.build();
// 비동기 처리
CompletableFuture.runAsync(() -> {
try {
// FCM 메시지 전송
BatchResponse response = FirebaseMessaging.getInstance().sendMulticast(multicastMessage);
System.out.println(response.getSuccessCount() + " messages were sent successfully");
System.out.println(response.getFailureCount() + " messages failed to send.");
} catch (FirebaseMessagingException e) {
System.out.println("Error sending FCM message: " + e.getMessage());
}
});
}
}
검색해보니 최근부터 나와 같은 오류를 만난 사람이 많았다
sendMulticast()는 deprecated 되었고 sendEachForMulticast()를 대신 사용하면 된다.
[수정]
BatchResponse response = FirebaseMessaging.getInstance().sendEachForMulticast(multicastMessage);
결과
'개발' 카테고리의 다른 글
AWS 단일 서버 설정 (Docker) - 2편 (0) | 2024.10.07 |
---|---|
AWS 단일 서버 설정 (Load Balancer, SSL) - 1편 (0) | 2024.10.04 |
[스프링부트] FCM (Firebase Cloud Messaging) - 개별 전송 (1) | 2024.10.02 |
[스프링부트] 마케팅 수신 동의 멤버 조회, @Cache- (0) | 2024.10.02 |
[스프링부트] 필수 약관 - Native Query (0) | 2024.09.25 |