У меня есть клиент 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.
Разве клиент не должен быть в состоянии "зависнуть" без какого-либо сотрудничества со стороны сервера?