Чего я хочу достичь
Я хочу получить строковую переменную, которую я использую как @DestinationVariable
, называемую lobbyName
, когда сокет отключается с помощью @EventListener
на стороне сервера:
@Component
public class WebSocketEventListener {
private SimpMessageSendingOperations messagingTemplate;
public WebSocketEventListener(SimpMessageSendingOperations messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
@EventListener
public void handleWebSocketDisconnectListener(SessionDisconnectEvent event) {
//here I want to get my data
}
}
Моя проблема
Я пытался получить lobbyName
, используя SessionDisonnectEvent
, но я не знаю, как, когда и где поместить этот lobbyName
, чтобы он был в SessionDisconnectEvent
.
Что я пытался
На стороне сервера:
@Controller
public class WebSocketController {
private final SimpMessagingTemplate template;
WebSocketController(SimpMessagingTemplate template) {
this.template = template;
}
public void pokeLobby(@DestinationVariable String lobbyName, SocketMessage message) {
// This didn't work
// Map<String, Object> headers = new HashMap<>();
// headers.put("lobbyName", lobbyName);
// this.template.convertAndSend("/lobby/"+lobbyName.toLowerCase(), message, headers);
this.template.convertAndSend("/lobby/"+lobbyName.toLowerCase(), message);
}
}
Можно ли это делать на стороне клиента? :
connectToLobbyWebSocket(lobbyName: string): void {
const ws = new SockJS(this.addressStorage.apiAddress + '/socket');
this.stompClient = Stomp.over(ws);
// this.stompClient.debug = null;
const that = this;
this.stompClient.connect({}, function () {
that.stompClient.subscribe('/lobby/' + lobbyName, (message) => {
if (message.body) {
that.socketMessage.next(message.body); //client logic
}
});
});
}
РЕДАКТИРОВАТЬ (прогресс)
Поскольку я легко могу получить sessionId
на SessionDisconnectEvent
, я решил изменить sessionId
(после рукопожатия) на что-то вроде playerId:lobbyName:uuid
Я не чувствую себя очень комфортно с этим решением, поэтому, если у вас есть какие-либо предложения, я весь слух.
const ws = new SockJS(this.addressStorage.apiAddress + '/socket', null, {
sessionId: function (): string {
return that.authManager.playerId + ':' + lobbyName + ':' + uuid();
}
});