如何从 Spring WebSocket STOMP 中的 UNSUBSCRIBE 框架获取订阅目的地

问题描述 投票:0回答:3

我正在使用 Spring WebSocket STOMP。我需要保存

SUBSCRIBE
框架中的所有订阅目的地并将其在
UNSUBSCRIBE
框架中删除,但是如何从取消订阅框架中获取目的地?

spring-websocket stomp
3个回答
0
投票

UNSUBSCRIBE
框架不包含目的地名称。它仅包含一个
id
标头,该标头必须与最初发送相应
id
 帧的客户端提供的 
SUBSCRIBE
标头相匹配。 STOMP 代理实现本身会跟踪连接/ID/目的地关系。如果您想在客户端发送
UNSUBSCRIBE
帧时执行自己的逻辑,您需要自己跟踪这一点。


0
投票

最后,我修改了

SUBSCRIBE
框架中的默认 id 标头作为目标,如下所示

subscription=stompClient.subscribe('/destination', function(data){
        if (data.body) {
            console.log(data);
            $("#response").text(data.body);
        } else {
            alert("got empty message");
        }
                
            },{ id: '/destination' });

然后我从

UNSUBSCRIBE
框架获取id


0
投票

据我所知,

spring-boot-starter-websocket
并没有给出
UNSUBSCRIBE
事件的目的地。一种方法是使用
simpSessionId
,它在整个会话中保持不变。如果您使用 stompjs,它会包含一个随机生成的 id,该 id 在整个会话中保持不变。

您必须维护 sessionId -> 目的地的映射并实现您的用例。 像这样的东西

@Component
@Slf4j
public class WebSocketEventListener {

    private final Map<String, String> simpSessionIdToSubscriptionId;

    public WebSocketEventListener(){
        this.simpSessionIdToSubscriptionId = new ConcurrentHashMap<>();
    }

    @EventListener
    @SendToUser
    public void handleSubscribeEvent(SessionSubscribeEvent sessionSubscribeEvent){
        String subscribedChannel = (String) sessionSubscribeEvent.getMessage().getHeaders().get("simpDestination");
        String simpSessionId = (String) sessionSubscribeEvent.getMessage().getHeaders().get("simpSessionId");
        simpSessionIdToSubscriptionId.put(simpSessionId, subscribedChannel);

    }

    @EventListener
    public void handleUnSubscribeEvent(SessionUnsubscribeEvent unsubscribeEvent){
        String simpSessionId = (String) unsubscribeEvent.getMessage().getHeaders().get("simpSessionId");
        String destination = simpSessionIdToSubscriptionId.get(simpSessionId);
        // do whatever you want with destination
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.