我有一个非常简单的Spring WebSocket应用程序。但是,我尝试使用路径变量来订阅和消息映射。
下面是一个简化的示例。我期望
值得注意的是,订阅字面值
我对WebSockets或这个Spring项目不是很熟悉,提前感谢您。 Controller.java
下面是一个简化的示例。我期望
@SendTo
注释基于其fleetId
返回给订阅者。即,对/fleet/MyFleet/driver/MyDriver
的POST
应该通知/fleet/MyFleet
的订阅者,但我没有看到这种行为。值得注意的是,订阅字面值
/fleet/{fleetId}
有效。这是有意的吗?我是否缺少某些配置?还是它就是这样工作的?我对WebSockets或这个Spring项目不是很熟悉,提前感谢您。 Controller.java
...
@MessageMapping("/fleet/{fleetId}/driver/{driverId}")
@SendTo("/topic/fleet/{fleetId}")
public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {
return new Simple(fleetId, driverId);
}
...
WebSocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/live");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/fleet").withSockJS();
}
}
index.html
var socket = new SockJS('/fleet');
var stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
// Doesn't Work
stompClient.subscribe('/topic/fleet/MyFleet', function(greeting) {
// Works
stompClient.subscribe('/topic/fleet/{fleetId}', function(greeting) {
// Do some stuff
});
});
发送样本
stompClient.send("/live/fleet/MyFleet/driver/MyDriver", {}, JSON.stringify({
// Some simple content
}));
@SubscribeMapping
仅拦截订阅(而不是通道中的消息),返回值将直接发送给用户,但可以使用@SendTo
覆盖以将其发送到另一个目标(将转发到 brokerChannel)。@SendTo
还可与@MessageMapping
一起使用,将响应发送到特定目标。因此,基本上可以将@SendTo
与@MessageMapping
和@SubscribeMapping
一起使用。 - Sergi Almar