我在前端使用comment,在后端使用ActiveMQ向客户端发送推送通知。客户端首先使用以下代码订阅主题:
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秒超时)。这导致在客户端重新连接时来自服务器的某些消息丢失。有什么方法可以阻止这种情况吗?
我在后端使用Spring WebSocket。这是配置:
@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;
}
}
答案 0 :(得分:1)
当然可以。
你需要改变一些事情。
这里所有描述都是:Using Queue Browsers to Implement Durable Topic Subscriptions
但我会给你一个简短的概述。
对您的消息传递结构进行了一些重要更改:
这是一个基本的例子:
请记住,经纪人可能会因为您需要遵循网页上的建议而被堵塞的消息被堵塞: