Skip to content

Commit

Permalink
[feat] 웹소켓 disconnect 발생시 구독 정보 삭제
Browse files Browse the repository at this point in the history
  • Loading branch information
hyeesw committed May 30, 2024
1 parent 23f1739 commit 7fdbb24
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,24 @@ public synchronized boolean hasSubscription(String sessionId, String destination
return subscriptions.containsKey(sessionId) && subscriptions.get(sessionId).contains(destination);
}

// 구독 취소
public synchronized void removeSubscription(String sessionId, String destination) {
if (subscriptions.containsKey(sessionId)) {
Set<String> destinations = subscriptions.get(sessionId);
destinations.remove(destination);
if (destinations.isEmpty()) {
subscriptions.remove(sessionId);
}
}
}

// 특정 세션의 모든 구독 취소
public synchronized void removeSubscriptionsBySessionId(String sessionId) {
subscriptions.remove(sessionId);
}

// 전체 구독 정보를 출력
public synchronized void printSubscriptions() {
System.out.println("웹소켓 구독 정보: " + subscriptions);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import org.springframework.context.event.EventListener;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.messaging.SessionDisconnectEvent;
import org.springframework.web.socket.messaging.SessionSubscribeEvent;
import org.springframework.web.socket.messaging.SessionUnsubscribeEvent;

@Component
public class WebSocketEventListener {
Expand All @@ -15,22 +17,46 @@ public WebSocketEventListener(SubscriptionRegistry subscriptionRegistry) {
this.subscriptionRegistry = subscriptionRegistry;
}

// 구독 이벤트 발생 시, 구독 처리
@EventListener
public void handleSubscribeEvent(SessionSubscribeEvent event) {
// 구독 이벤트 발생 시, 구독 처리
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
String sessionId = headerAccessor.getSessionId();
String destination = headerAccessor.getDestination();

// 이미 구독된 경우, 추가 처리 없이 반환
// 이미 구독된 경우 pass
if (destination != null && subscriptionRegistry.hasSubscription(sessionId, destination)) {
return;
}
// 중복이 아닌 경우만 구독 추가
subscriptionRegistry.addSubscription(sessionId, destination);
subscriptionRegistry.printSubscriptions(); // 구독 정보 출력
}

// 구독 정보 출력
subscriptionRegistry.printSubscriptions();
// 구독 취소 이벤트 발생 시, 구독 취소 처리
@EventListener
public void handleUnsubscribeEvent(SessionUnsubscribeEvent event) {
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
String sessionId = headerAccessor.getSessionId();
String subscriptionId = headerAccessor.getSubscriptionId();

System.out.println(
"구독 취소 이벤트 sessionId: " + sessionId + ", subscriptionId: " + subscriptionId);
// 구독 취소 시 구독 정보 삭제
subscriptionRegistry.removeSubscription(sessionId, subscriptionId);
subscriptionRegistry.printSubscriptions(); // 구독 정보 출력
}
}

// 웹소켓 disconnect 이벤트 발생 시, 해당 세션의 모든 구독 취소 처리
@EventListener
public void handleDisconnectEvent(SessionDisconnectEvent event) {
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
String sessionId = headerAccessor.getSessionId();

System.out.println("웹소켓 disconnect 이벤트 sessionId: " + sessionId);

// 연결 종료 시 모든 구독 정보 삭제
subscriptionRegistry.removeSubscriptionsBySessionId(sessionId);
subscriptionRegistry.printSubscriptions(); // 구독 정보 출력
}
}

0 comments on commit 7fdbb24

Please sign in to comment.