在一个请求中从 JS 到 Spring 的多个 STOMP 订阅
Multiple STOMP subscriptions from JS to Spring in one request
目标是使用 Web 界面和 Spring 框架进行多人聊天。看起来 STOMP over SockJS 是此类项目的最佳组合。 STOMP 基于目的地的订阅解决了所有广播问题。但是如果用户一次使用 100 个(例如)聊天,我需要在他每次登录时从 Web 客户端发送 100 个订阅请求。
所以我正在寻找替代的单一请求解决方案。让我整理一下问题:
1) 有没有办法让一个客户端 STOMP 请求同时进行多个订阅?如果可以使用其他 JS 库提出此类请求 - 那么我将很乐意尝试。
2) 有没有办法从 Spring 后端发起订阅?在服务器端为一个客户端注册多个目标消息查询会很棒 - 我可以为此使用特殊请求或在登录期间执行此操作。
3) 关于这个问题还有其他建议吗?再次声明:我很高兴在万不得已的情况下尝试其他流行技术。
下面的代码是最简单的回显服务。我只是在测试这个协议和技术。
基本客户端代码:
window.onload = function () {
window.s = new SockJS("http://localhost:8080/portfolio");
window.s.onopen = function () {
window.stompClient = Stomp.over(window.s);
stompClient.connect('admin', 'admin', function(frame) {
console.log('Connected: ', frame);
stompClient.subscribe('/topic/echo', function(messageOutput) {
console.log(messageOutput.body);
})}, function(e){console.log("Fail My: ", e);})();
};
};
STOMP 配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/portfolio").setAllowedOrigins("*").withSockJS()
.setClientLibraryUrl( "https://cdn.jsdelivr.net/npm/sockjs-client@1.3.0/dist/sockjs.min.js" );
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic/");
registry.setApplicationDestinationPrefixes("/app");
}
}
STOMP 控制器:
@Controller
public class GreetingController {
@MessageMapping("/greetings")
@SendTo("/topic/echo")
public String handleMessage(@Payload String greeting) {
System.out.println("[received]:" + greeting);
return "[echo]: " + greeting;
}
}
The STOMP specification 表示 1 SUBSCRIBE
帧与 1 个订阅相关。换句话说,无法为单个 SUBSCRIBE
帧获得多个订阅。
library/API 有可能(尽管我认为不太可能)在一次调用中包含发送多个 SUBSCRIBE
帧的能力,但这只是一种方便的方法,不会实际上在协议级别产生任何类型的性能优势。
目标是使用 Web 界面和 Spring 框架进行多人聊天。看起来 STOMP over SockJS 是此类项目的最佳组合。 STOMP 基于目的地的订阅解决了所有广播问题。但是如果用户一次使用 100 个(例如)聊天,我需要在他每次登录时从 Web 客户端发送 100 个订阅请求。
所以我正在寻找替代的单一请求解决方案。让我整理一下问题:
1) 有没有办法让一个客户端 STOMP 请求同时进行多个订阅?如果可以使用其他 JS 库提出此类请求 - 那么我将很乐意尝试。
2) 有没有办法从 Spring 后端发起订阅?在服务器端为一个客户端注册多个目标消息查询会很棒 - 我可以为此使用特殊请求或在登录期间执行此操作。
3) 关于这个问题还有其他建议吗?再次声明:我很高兴在万不得已的情况下尝试其他流行技术。
下面的代码是最简单的回显服务。我只是在测试这个协议和技术。
基本客户端代码:
window.onload = function () {
window.s = new SockJS("http://localhost:8080/portfolio");
window.s.onopen = function () {
window.stompClient = Stomp.over(window.s);
stompClient.connect('admin', 'admin', function(frame) {
console.log('Connected: ', frame);
stompClient.subscribe('/topic/echo', function(messageOutput) {
console.log(messageOutput.body);
})}, function(e){console.log("Fail My: ", e);})();
};
};
STOMP 配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/portfolio").setAllowedOrigins("*").withSockJS()
.setClientLibraryUrl( "https://cdn.jsdelivr.net/npm/sockjs-client@1.3.0/dist/sockjs.min.js" );
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic/");
registry.setApplicationDestinationPrefixes("/app");
}
}
STOMP 控制器:
@Controller
public class GreetingController {
@MessageMapping("/greetings")
@SendTo("/topic/echo")
public String handleMessage(@Payload String greeting) {
System.out.println("[received]:" + greeting);
return "[echo]: " + greeting;
}
}
The STOMP specification 表示 1 SUBSCRIBE
帧与 1 个订阅相关。换句话说,无法为单个 SUBSCRIBE
帧获得多个订阅。
library/API 有可能(尽管我认为不太可能)在一次调用中包含发送多个 SUBSCRIBE
帧的能力,但这只是一种方便的方法,不会实际上在协议级别产生任何类型的性能优势。