我正在使用 Spring WebSocket STOMP。我需要保存
SUBSCRIBE
框架中的所有订阅目的地并将其在 UNSUBSCRIBE
框架中删除,但是如何从取消订阅框架中获取目的地?
UNSUBSCRIBE
框架不包含目的地名称。它仅包含一个 id
标头,该标头必须与最初发送相应 id
帧的客户端提供的
SUBSCRIBE
标头相匹配。 STOMP 代理实现本身会跟踪连接/ID/目的地关系。如果您想在客户端发送 UNSUBSCRIBE
帧时执行自己的逻辑,您需要自己跟踪这一点。
最后,我修改了
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
据我所知,
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
}
}