From 96e643db6f65cc4b9d3bc8b922bcfb1aeddcb38e Mon Sep 17 00:00:00 2001 From: Hyun0828 Date: Wed, 27 Aug 2025 22:46:17 +0900 Subject: [PATCH] =?UTF-8?q?[Bug/#433]=20SSE=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20+=2030=EC=B4=88=EB=A7=88=EB=8B=A4=20?= =?UTF-8?q?=ED=95=98=ED=8A=B8=EB=B9=84=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stackpot/stackpot/event/SseService.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/stackpot/stackpot/event/SseService.java b/src/main/java/stackpot/stackpot/event/SseService.java index 9517eef..574c291 100644 --- a/src/main/java/stackpot/stackpot/event/SseService.java +++ b/src/main/java/stackpot/stackpot/event/SseService.java @@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; @@ -19,6 +20,7 @@ import stackpot.stackpot.pot.dto.UserMemberIdDto; import stackpot.stackpot.pot.service.potMember.PotMemberQueryService; +import java.io.IOException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; @@ -49,11 +51,26 @@ public SseEmitter connect() { try { emitter.send(SseEmitter.event().name("connect").data("연결 완료!")); } catch (Exception e) { + log.error("SSE 연결 중 에러 발생: {}", e.getMessage()); emitters.remove(userId); } return emitter; } + @Scheduled(fixedRate = 30000) // 30초마다 실행 + public void sendHeartbeat() { + emitters.forEach((userId, emitter) -> { + try { + emitter.send(SseEmitter.event() + .name("heartbeat") + .data("keep-alive at " + System.currentTimeMillis())); + } catch (IOException e) { + log.warn("Failed to send heartbeat to user {}, removing emitter.", userId); + emitters.remove(userId); + } + }); + } + public void sendChatRoomList(Long chatRoomId) { Long potId = chatRoomQueryService.selectPotIdByChatRoomId(chatRoomId); List allUserIds = potMemberQueryService.selectUserIdsAboutPotMembersByPotId(potId); // 채팅방에 있는 모든 사용자 userId