Skip to content

Commit d2c1c03

Browse files
committed
DRAW-347 feat: 웹소켓 ping manager 구현
1 parent 3936a25 commit d2c1c03

2 files changed

Lines changed: 52 additions & 5 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.xorker.draw.websocket.session
2+
3+
import com.xorker.draw.websocket.SessionEventListener
4+
import com.xorker.draw.websocket.WaitingQueueUseCase
5+
import java.util.concurrent.TimeUnit
6+
import org.springframework.scheduling.annotation.Scheduled
7+
import org.springframework.stereotype.Component
8+
9+
@Component
10+
internal class PingManager(
11+
private val sessionManager: SessionManager,
12+
private val waitingQueueUseCase: WaitingQueueUseCase,
13+
private val sessionEventListener: List<SessionEventListener>,
14+
) {
15+
16+
@Scheduled(fixedRate = 3000, timeUnit = TimeUnit.MILLISECONDS)
17+
fun checkSessionStatus() {
18+
val sessions = sessionManager.getSessions()
19+
20+
sessions.forEach { session ->
21+
if (session.ping.not()) {
22+
val user = session.user
23+
24+
sessionManager.unregisterSession(session.id)
25+
26+
waitingQueueUseCase.remove(user, session.locale)
27+
28+
sessionEventListener.forEach {
29+
it.exitSession(user.id)
30+
}
31+
} else {
32+
session.ping = false
33+
}
34+
}
35+
}
36+
}

app/websocket/src/main/kotlin/com/xorker/draw/websocket/session/SessionManager.kt

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@ package com.xorker.draw.websocket.session
22

33
import com.xorker.draw.user.UserId
44
import java.util.concurrent.ConcurrentHashMap
5-
import org.springframework.core.Ordered
6-
import org.springframework.core.annotation.Order
7-
import org.springframework.stereotype.Service
5+
import org.springframework.stereotype.Component
86

9-
@Order(Ordered.HIGHEST_PRECEDENCE)
10-
@Service
7+
@Component
118
internal class SessionManager {
129
private val sessionMap: ConcurrentHashMap<SessionId, Session> = ConcurrentHashMap()
1310
private val userIdMap: ConcurrentHashMap<UserId, Session> = ConcurrentHashMap()
@@ -20,6 +17,12 @@ internal class SessionManager {
2017
return userIdMap[userId]
2118
}
2219

20+
fun getSessions(): List<Session> {
21+
val sessions = sessionMap.values
22+
23+
return sessions.toList()
24+
}
25+
2326
fun registerSession(session: Session) {
2427
if (sessionMap.contains(session.id)) {
2528
// Init을 중복으로 호출 하면 기존 데이터를 Unregister 하고 Init 한다.
@@ -34,4 +37,12 @@ internal class SessionManager {
3437
val session = sessionMap.remove(sessionId)
3538
return userIdMap.remove(session?.user?.id)
3639
}
40+
41+
fun setPing(sessionId: SessionId) {
42+
val session = sessionMap[sessionId]
43+
44+
session?.let {
45+
session.ping = true
46+
}
47+
}
3748
}

0 commit comments

Comments
 (0)