Отключенный сеанс Spring STOMP по-прежнему получает кадры - PullRequest
0 голосов
/ 13 марта 2019

У меня есть клиент STOMP, разработанный с использованием Spring StompSession и StompSessionHandler. Его задача - установить двустороннюю связь с сервером WS (NodeJs), по которому будут обмениваться данными, пока сервер выполняет некоторые задачи. Когда процесс завершен, сервер уведомляет клиента окончательным сообщением, и клиент закрывает канал WS.

Если сервер отправляет сообщение по какой-либо подписке, которую слушал клиент, после того, как клиент закрыл канал WS, сообщение все еще получено Клиентом.

Я бы не ожидал, что это произойдет, и любые потенциальные сообщения, размещенные сервером при подписке, никогда не дойдут до отключившегося клиента.

Вот как мой клиент подключается и отключается:

Connect:

// MyStompSessionHandler implements StompSessionHandler
MyStompSessionHandler sessionHandler = new MyStompSessionHandler();
WebSocketClient client = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(client);        
stompClient.setMessageConverter(new MappingJackson2MessageConverter());     
stompClient.start();
ListenableFuture<StompSession> sessionReadyFuture = stompClient.connect(url, sessionHandler);
StompSession connectedSession = sessionReadyFuture.get(CONNECTION_TIMEOUT_SECONDS , TimeUnit.SECONDS);

StompHeaders headers = new StompHeaders();
headers.add("destination", destination);
headers.add("id", subscriptionId);

// MyFrameHandler implements StompFrameHandler
connectedSession.subscribe(headers, new MyFrameHandler());

Disconnect:

stompClient.stop();
connectedSession.disconnect();

После выполнения кода разъединения экземпляр MyFrameHandler () по-прежнему получает кадры, если сервер отправляет какие-либо.

Что еще нужно сделать, чтобы отключить клиент и закрыть соединение? Нужно ли как-то отменять подписку на обработчик фреймов?

Спасибо.

UPDATE

После некоторой отладки и перечитывания документов Spring и проекта STOMP я понял, что в моей реализации сервера (nodejs) были получены кадры DISCONNECT, но с ними ничего не было сделано. Теперь я расширил свой серверный код, чтобы закрыть основное подключение к веб-сокету при получении фрейма DISCONNECT. При этом клиент больше не получает сообщения после отключения.

Пока я предполагаю, что это была проблема. Хотя я не совсем уверен, что для того, чтобы клиент был действительно отключен, сервер должен закрыть соединение WS.

Разве клиент не должен быть в состоянии "зависнуть" без какого-либо сотрудничества со стороны сервера?

...