본문 바로가기

개발

[스프링부트] FCM (Firebase Cloud Messaging) - bulk + 비동기 전송

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

 

 

검색해보니 최근부터 나와 같은 오류를 만난 사람이 많았다

https://community.flutterflow.io/discussions/post/the-messaging-sendmulticast-function-is-no-longer-supported-in-firebase-KVt3BAb65dNRhk6

 

The Messaging.sendMulticast() Function is No Longer Supported in Firebase Admin SDK!

async function sendPushNotifications(snapshot) { //... var numSent = 0; await Promise.all(messageBatches.map(async (messages) => { const response = await admin.messaging().sendEachForMulticast(...

community.flutterflow.io

sendMulticast()는 deprecated 되었고 sendEachForMulticast()를 대신 사용하면 된다.

 

[수정]

BatchResponse response = FirebaseMessaging.getInstance().sendEachForMulticast(multicastMessage);

 

 

결과