Skip to content

Commit bf007e3

Browse files
Merge pull request #82 from Clover-21/develop
fix: sse - λ‹€μ‹œ 이전 μ½”λ“œλ‘œ 되돌림
2 parents 44c1ff0 + 284dcf6 commit bf007e3

1 file changed

Lines changed: 11 additions & 36 deletions

File tree

β€Žsrc/main/java/clovar/howkiki/domain/notification/service/SseService.javaβ€Ž

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -24,71 +24,49 @@ public class SseService {
2424

2525
private final ObjectMapper objectMapper; // json으둜 λ³€ν™˜ μœ„ν•¨
2626
private final Map<String, SseEmitter> emitters = new ConcurrentHashMap<>(); // λ™μ‹œμ„± κ³ λ €
27-
// 각 emitter별 ping μ‹€νŒ¨ 횟수λ₯Ό μ €μž₯ν•˜λŠ” λ§΅ (μ΅œλŒ€ ν—ˆμš© μ‹€νŒ¨ 횟수: μ˜ˆμ‹œλ‘œ 3회)
28-
private final Map<String, Integer> pingFailureCounts = new ConcurrentHashMap<>();
29-
private static final int MAX_PING_FAILURE_COUNT = 3;
3027

3128
/* SSE ꡬ독 - (ν΄λΌμ΄μ–ΈνŠΈκ°€ SSE μ—°κ²°ν•  λ•Œ ν˜ΈμΆœλ˜μ–΄ μ•Œλ¦Ό 받을 μ€€λΉ„) */
3229
public SseEmitter subscribe(String sessionToken) {
3330
// κΈ°μ‘΄ Emitterκ°€ μžˆλ‹€λ©΄ μ‚­μ œ
3431
if (emitters.containsKey(sessionToken)) {
35-
log.info("κΈ°μ‘΄ SSE Emitterκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. κΈ°μ‘΄ emitter μ‚­μ œ ν›„ λ‹€μ‹œ 생성- sessionToken: {}", sessionToken);
32+
log.info("κΈ°μ‘΄ SSE Emitter μ‚­μ œ - sessionToken: {}", sessionToken);
3633
emitters.remove(sessionToken);
34+
log.info("κΈ°μ‘΄ SSE Emitterκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€. - sessionToken: {}", sessionToken);
3735
}
3836

3937
// emitter 생성
4038
SseEmitter sseEmitter = new SseEmitter(60* 60 * 1000L); // 60λΆ„κ°„ μ„œλ²„μ—μ„œ 아무것도 보내지 μ•ŠμœΌλ©΄ νƒ€μž„μ•„μ›ƒλ˜λ„λ‘ μ„€μ •
4139
emitters.put(sessionToken, sseEmitter);
42-
// 초기 ping μ‹€νŒ¨ 카운트 0으둜 μ΄ˆκΈ°ν™”
43-
pingFailureCounts.put(sessionToken, 0);
4440

4541
// μ—°κ²° 지속을 μœ„ν•œ ping 보내기 (30μ΄ˆλ§ˆλ‹€)
4642
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
4743
scheduler.scheduleAtFixedRate(() -> {
4844
try {
4945
sseEmitter.send(SseEmitter.event().name("ping").data("μ—°κ²° 쀑단 λ°©μ§€μš© ping"));
50-
// μ„±κ³΅μ μœΌλ‘œ ping μ „μ†‘λ˜λ©΄ μ‹€νŒ¨ 카운트λ₯Ό μ΄ˆκΈ°ν™”
51-
pingFailureCounts.put(sessionToken, 0);
5246
} catch (IOException e) {
53-
int failCount = pingFailureCounts.getOrDefault(sessionToken, 0);
54-
failCount++;
55-
pingFailureCounts.put(sessionToken, failCount);
5647
log.info("ping 전달 μ‹€νŒ¨ μ‚¬μœ : {}", e.getMessage());
5748
log.warn("❌ ping failed - sessionToken: {}", sessionToken);
58-
// μ‹€νŒ¨ νšŸμˆ˜κ°€ MAX_PING_FAILURE_COUNT μ΄ˆκ³Όν•˜λ©΄ emitter μ‚­μ œ
59-
if (failCount >= MAX_PING_FAILURE_COUNT) {
60-
log.warn("⚠️ ping μ‹€νŒ¨ 횟수 초과 - emitter μ‚­μ œ - sessionToken: {}", sessionToken);
61-
emitters.remove(sessionToken);
62-
scheduler.shutdown(); // μŠ€μΌ€μ€„λŸ¬ μ’…λ£Œ
63-
}
6449
}
6550
}, 30, 30, TimeUnit.SECONDS); // 30μ΄ˆλ§ˆλ‹€
6651

6752
// ν•œ 번 μš”μ²­μ΄ λ“€μ–΄μ˜¨ ν›„ μ•„λž˜μ˜ 둜직 떄문에 더이상 μ•Œλ¦Όμ΄ μ•ˆμ˜€λŠ” 문제 λ°œμƒ, μž μ‹œ 주석 처리
68-
// emitter μ’…λ£Œ 이벀트 처리 - ν΄λΌμ΄μ–ΈνŠΈμ˜ λΈŒλΌμš°μ €κ°€ μ’…λ£Œλ˜κ±°λ‚˜ νŽ˜μ΄μ§€ μ΄λ™ν•œ 경우, .complete() κ°€ μ‹€ν–‰λˆ 경우
69-
sseEmitter.onCompletion(() -> {
70-
log.info("emitter μ‚­μ œ: SSE Emitter 정상 μ’…λ£Œ - sessionToken: {}", sessionToken);
71-
emitters.remove(sessionToken);
72-
pingFailureCounts.remove(sessionToken);
73-
});
53+
// // μ‚¬μš©μžμ—κ²Œ λͺ¨λ“  데이터 μ „μ†‘λ˜μ—ˆλ‹€λ©΄ emitter μ‚­μ œ
54+
// sseEmitter.onCompletion(() -> {
55+
// log.info("emitter μ‚­μ œ: SSE Emitter 정상 μ’…λ£Œ - sessionToken: {}", sessionToken);
56+
// emitters.remove(sessionToken);
57+
// });
7458
// emitter의 μœ νš¨μ‹œκ°„ λ§Œλ£Œμ‹œ emmitter μ‚­μ œ
7559
sseEmitter.onTimeout(() -> {
7660
log.info("emitter μ‚­μ œ: SSE Emitter νƒ€μž„μ•„μ›ƒ - sessionToken: {}", sessionToken);
7761
emitters.remove(sessionToken);
78-
pingFailureCounts.remove(sessionToken);
79-
});
80-
sseEmitter.onError((e) -> {
81-
log.warn("πŸ”₯ SSE Emitter μ—λŸ¬ λ°œμƒ - sessionToken: {}", sessionToken);
82-
emitters.remove(sessionToken);
83-
pingFailureCounts.remove(sessionToken);
8462
});
8563

8664
// ν˜„μž¬ λ“±λ‘λœ Emitter 개수 확인
8765
log.info("πŸ” ν˜„μž¬ μ €μž₯된 SSE Emitter 개수: {}", emitters.size());
8866

8967
// 503 μ—λŸ¬ λ°©μ§€λ₯Ό μœ„ν•΄ 초기 더미 데이터 전솑
9068
try {
91-
sseEmitter.send(SseEmitter.event().name("connect").data("SSE ꡬ독 성곡!").reconnectTime(1000)); // 1초 ν›„ μž¬μ‹œλ„
69+
sseEmitter.send(SseEmitter.event().name("connect").data("SSE ꡬ독 성곡!"));
9270
} catch (IOException e) {
9371
emitters.remove(sessionToken);
9472
log.error("❌ SSE - 더미 데이터 전솑 μ‹€νŒ¨");
@@ -100,9 +78,8 @@ public SseEmitter subscribe(String sessionToken) {
10078
@Override
10179
public void run() {
10280
if (emitters.containsKey(sessionToken)) {
103-
log.info("SSE Emitter κ°•μ œ μ‚­μ œ - 24μ‹œκ°„ 지남 - sessionToken: {}", sessionToken);
81+
log.info("SSE Emitter κ°•μ œ μ‚­μ œ - sessionToken: {}", sessionToken);
10482
emitters.remove(sessionToken);
105-
pingFailureCounts.remove(sessionToken);
10683
}
10784
}
10885
}, 24 * 60 * 60 * 1000); // 24μ‹œκ°„ ν›„ κ°•μ œ μ‚­μ œ
@@ -133,9 +110,8 @@ public <T> void sendNotification(String sessionToken, T responseDto) {
133110
log.info("βœ… SSE λ©”μ‹œμ§€ 전솑 μ™„λ£Œ!");
134111

135112
} catch (Exception e) {
136-
log.error("❌ SSE λ©”μ‹œμ§€ 전솑 μ‹€νŒ¨ - sessionToken: {} / 이유: {}", sessionToken, e.getMessage());
113+
log.error("❌ SSE λ©”μ‹œμ§€ 전솑 μ‹€νŒ¨ - sessionToken: {} - {}", sessionToken, e.getMessage());
137114
emitters.remove(sessionToken);
138-
pingFailureCounts.remove(sessionToken);
139115
throw new CustomException(FAILED_TO_SEND_NOTICE, null);
140116
}
141117
}
@@ -165,8 +141,7 @@ public void shutdown() {
165141
List<SseEmitter> emitterList = new ArrayList<>(emitters.values());
166142
for (SseEmitter emitter : emitterList) {
167143
try {
168-
emitter.send(SseEmitter.event().name("end").data("μ—°κ²° 정상 μ’…λ£Œ"));
169-
emitter.complete(); // 정상 μ’…λ£Œ // emitter.onCompletion 싀행됨
144+
emitter.complete(); // 정상 μ’…λ£Œ
170145
} catch (Exception e) {
171146
log.error("SSE μ’…λ£Œ 쀑 였λ₯˜ λ°œμƒ: {}", e.getMessage());
172147
}

0 commit comments

Comments
Β (0)