客户端重新连接时WebSocket消息丢失
我在前端使用ActiveMQ,在后端使用ActiveMQ向客户端发送推送通知。客户端首先使用以下代码订阅主题:客户端重新连接时WebSocket消息丢失,websocket,activemq,stomp,spring-websocket,Websocket,Activemq,Stomp,Spring Websocket,我在前端使用ActiveMQ,在后端使用ActiveMQ向客户端发送推送通知。客户端首先使用以下代码订阅主题: function stompConnect() { console.log('STOMP: Attempting connection'); // recreate the stompClient to use a new WebSocket var socket = new SockJS('/websocket'); var stompClient =
function stompConnect() {
console.log('STOMP: Attempting connection');
// recreate the stompClient to use a new WebSocket
var socket = new SockJS('/websocket');
var stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
stompClient.subscribe('/topic/table-updates', function(notification){
showNotification(JSON.parse(notification.body));
});
}, function (error) {
console.log('STOMP: ' + error);
setTimeout(stompConnect, 10000);
console.log('STOMP: Reconnecting in 10 seconds');
});
}
stompConnect();
有时底层websocket连接丢失,客户端需要重新连接并订阅主题(超时10秒)。这导致在客户端重新连接时,来自服务器的一些消息丢失。有没有办法防止这种情况
我在后端使用弹簧网套。以下是配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Value("${stomp.port}")
private Integer stompPort;
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/websocket").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry
.enableStompBrokerRelay("/topic/")
.setRelayPort(stompPort);
}
@Bean(initMethod = "start", destroyMethod = "stop")
public BrokerService brokerService() throws Exception {
final BrokerService broker = BrokerFactory.createBroker(
String.format("broker:(vm://localhost,stomp://localhost:%d)?persistent=false", stompPort));
broker.addShutdownHook(new SpringContextHook());
return broker;
}
}
当然可以
你需要改变一些事情
这里都有描述:
但我会给你一个简短的概述
对消息结构的一些重要更改:
- 为websocket使用者订阅“/queue/”而不是主题,并设置队列浏览李>
- 使用从制作人处发送消息
- 将具有过期时间的消息发送到队列,以便在达到过期时间后自动删除这些消息
- 定期运行正常的使用者应用程序,该应用程序可以将 队列和删除消息被视为不再需要