我有一个使用Spring的StompSession和StompSessionHandler开发的STOMP客户端。它的工作是与WS服务器(NodeJ)建立双向通信,在服务器执行某些任务的同时,将通过该服务器交换数据。该过程完成后,服务器将最终消息通知客户端,然后客户端关闭WS通道。
如果服务器碰巧在客户端正在收听的任何订阅上发布消息,则在客户端关闭WS通道后,客户端仍会接收到该消息。
我不希望发生这种情况,并且服务器在订阅上发布的任何潜在消息都永远无法到达断开连接的客户端。
这是我的客户端连接和断开连接的方式:
连接:
// 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());
断开连接:
stompClient.stop();
connectedSession.disconnect();
执行断开连接代码后,如果服务器发布了帧,则MyFrameHandler()实例仍会接收帧。
是否需要执行其他任何操作来断开客户端连接并关闭连接?我是否需要以某种方式退订帧处理程序?
谢谢。
更新
在调试和重新阅读了Spring文档和STOMP草案之后,我意识到在我的服务器实现(nodejs)中,收到了DISCONNECT帧,但对此没有做任何事情。现在,我扩展了服务器代码,以在接收到DISCONNECT帧时关闭基础的websocket连接。这样,断开连接后客户端不再接收任何消息。
我暂时认为这是问题所在。尽管我并不完全相信要使客户端真正断开连接,但服务器必须关闭WS连接。
如果没有服务器端的任何协作,客户端是否可以“挂断”?