Spring WebSockets @SendTo映射中的路径变量

我有一个非常简单的Spring WebSocket应用程序。但是,我正在尝试使用路径变量进行订阅以及消息映射。

我在下面发布了一个释义的示例。我希望@SendTo注解会根据订阅者的身份返回给订阅者fleetId。即,POSTto /fleet/MyFleet/driver/MyDriver应通知的订阅者/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

}));

回答:

即使@MessageMapping支持占位符,它们也不会在@SendTo目标位置公开/解析。当前,无法使用@SendTo注释定义动态目的地。你可以SimpMessagingTemplate暂时使用(无论如何这都是内部工作的方式)。这是你的操作方式:

@MessageMapping("/fleet/{fleetId}/driver/{driverId}")

public void simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {

simpMessagingTemplate.convertAndSend("/topic/fleet/" + fleetId, new Simple(fleetId, driverId));

}

在你的代码中,将目标’ / topic / fleet / {fleetId} ‘视为文字,这就是订阅它起作用的原因,只是因为你要发送到完全相同的目标。

如果你只想发送一些特定于用户的初始数据,则可以直接在订阅中返回:

@SubscribeMapping("/fleet/{fleetId}/driver/{driverId}")

public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {

return new Simple(fleetId, driverId);

}

更新: 在Spring 4.2中,支持目标变量占位符,现在可以执行以下操作:

@MessageMapping("/fleet/{fleetId}/driver/{driverId}")

@SendTo("/topic/fleet/{fleetId}")

public Simple simple(@DestinationVariable String fleetId, @DestinationVariable String driverId) {

return new Simple(fleetId, driverId);

}

以上是 Spring WebSockets @SendTo映射中的路径变量 的全部内容, 来源链接: utcz.com/qa/424954.html

回到顶部