Skip to content

Commit

Permalink
fix: BatchEntry ID 값 UUID로 수정 (#312)
Browse files Browse the repository at this point in the history
  • Loading branch information
dbscks97 authored Oct 18, 2024
1 parent 3b33a11 commit 02201d1
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import com.depromeet.stonebed.domain.missionRecord.dto.response.MissionRecordIdResponse;
import com.depromeet.stonebed.domain.missionRecord.dto.response.MissionRecordTabListResponse;
import com.depromeet.stonebed.domain.missionRecord.dto.response.MissionTabResponse;
import com.depromeet.stonebed.scheduler.fcm.FcmScheduler;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
Expand All @@ -27,7 +26,6 @@
public class MissionRecordController {

private final MissionRecordService missionRecordService;
private final FcmScheduler fcmScheduler;

@Operation(summary = "미션 탭 완료된 기록 리스트", description = "미션 탭에서 완료된 기록 리스트를 조회한다.")
@GetMapping
Expand Down Expand Up @@ -88,16 +86,4 @@ public ResponseEntity<Void> createMissionRecordBoost(
missionRecordService.createBoost(recordId, request.count());
return ResponseEntity.status(HttpStatus.CREATED).build();
}

@PostMapping("/daily")
public ResponseEntity<Void> dailyTest() {
fcmScheduler.sendDailyNotification();
return ResponseEntity.ok().build();
}

@PostMapping("/remind")
public ResponseEntity<Void> remindTest() {
fcmScheduler.sendReminderToIncompleteMissions();
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -49,51 +50,57 @@ public void sendMessage(Object message) {

public void sendBatchMessages(
List<String> tokens, String title, String message, String deepLink) {
List<SendMessageBatchRequestEntry> entries = new ArrayList<>();
// SQS 메시지의 최대 전송 크기는 10개이므로 이를 고려하여 분할합니다.
int batchSize = 10;
List<String> failedTokens = new ArrayList<>();
for (String token : tokens) {
try {
FcmMessage fcmMessage = FcmMessage.of(title, message, token, deepLink);
String messageBody = objectMapper.writeValueAsString(fcmMessage);
SendMessageBatchRequestEntry entry =
SendMessageBatchRequestEntry.builder()
.id(token)
.messageBody(messageBody)
.build();
entries.add(entry);
} catch (Exception e) {
log.error("메시지 직렬화 실패: {}", e.getMessage());

for (int i = 0; i < tokens.size(); i += batchSize) {
List<String> batchTokens = tokens.subList(i, Math.min(i + batchSize, tokens.size()));
List<SendMessageBatchRequestEntry> entries = new ArrayList<>();

for (String token : batchTokens) {
try {
FcmMessage fcmMessage = FcmMessage.of(title, message, token, deepLink);
String messageBody = objectMapper.writeValueAsString(fcmMessage);
SendMessageBatchRequestEntry entry =
SendMessageBatchRequestEntry.builder()
.id(UUID.randomUUID().toString())
.messageBody(messageBody)
.build();
entries.add(entry);
} catch (Exception e) {
log.error("메시지 직렬화 실패: {}", e.getMessage());
}
}
}

if (!entries.isEmpty()) {
SendMessageBatchRequest batchRequest =
SendMessageBatchRequest.builder()
.queueUrl(sqsProperties.queueUrl())
.entries(entries)
.build();
if (!entries.isEmpty()) {
SendMessageBatchRequest batchRequest =
SendMessageBatchRequest.builder()
.queueUrl(sqsProperties.queueUrl())
.entries(entries)
.build();

try {
SendMessageBatchResponse batchResponse = sqsClient.sendMessageBatch(batchRequest);
try {
SendMessageBatchResponse batchResponse =
sqsClient.sendMessageBatch(batchRequest);
log.info("배치 메시지 전송 응답: {}", batchResponse);
// 실패한 메시지 처리
List<BatchResultErrorEntry> failedMessages = batchResponse.failed();
for (BatchResultErrorEntry failed : failedMessages) {
log.error("메시지 전송 실패, ID {}: {}", failed.id(), failed.message());
failedTokens.add(failed.id());
}

// 실패한 메시지 처리
List<BatchResultErrorEntry> failedMessages = batchResponse.failed();
for (BatchResultErrorEntry failed : failedMessages) {
log.error("메시지 전송 실패, ID {}: {}", failed.id(), failed.message());
failedTokens.add(failed.id());
}
// 실패한 토큰 삭제
for (String failedToken : failedTokens) {
fcmTokenRepository.deleteByToken(failedToken);
log.info("비활성화된 FCM 토큰 삭제: {}", failedToken);
}

// 실패한 토큰 삭제 등의 후속 작업
for (String failedToken : failedTokens) {
fcmTokenRepository.deleteByToken(failedToken);
log.info("비활성화된 FCM 토큰 삭제: {}", failedToken);
} catch (Exception e) {
log.error("SQS 배치 메시지 전송 실패: {}", e.getMessage());
}

} catch (Exception e) {
log.error("SQS 배치 메시지 전송 실패: {}", e.getMessage());
}
} else {
log.warn("전송할 메시지가 없습니다.");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

import com.depromeet.stonebed.domain.missionRecord.application.MissionRecordService;
import com.depromeet.stonebed.domain.missionRecord.dto.request.MissionRecordBoostRequest;
import com.depromeet.stonebed.scheduler.fcm.FcmScheduler;
import com.google.gson.Gson;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -32,8 +31,6 @@ public class MissionRecordControllerTest {
@Autowired private MockMvc mockMvc;

@MockBean private MissionRecordService missionRecordService;
@MockBean private FcmScheduler fcmScheduler;

private final Gson gson = new Gson();

@Test
Expand Down

0 comments on commit 02201d1

Please sign in to comment.