我正在使用 RabbitMQ 作为代理创建一个 spring websocket 应用程序。有没有办法过滤用户将在频道上看到的 Web 套接字消息?
多人将订阅该频道。
我正在使用 RabbitMQ 作为代理创建一个 spring websocket 应用程序。有没有办法过滤用户将在频道上看到的 Web 套接字消息?
多人将订阅该频道。
为了能够在 Spring 中向通过 Web Sockets 连接的特定用户发送消息,您可以将 @SendToUser 注释与 SimpMessagingTemplate 结合使用
但简而言之(取自参考)首先设置您的主题
@Controller
public class PortfolioController {
@MessageMapping("/trade")
@SendToUser("/queue/position-updates")
public TradeResult executeTrade(Trade trade, Principal principal) {
// ...
return tradeResult;
}
}
实现您自己的 UserDestinationResolver 或使用默认的 http://docs.spring.io/autorepo/docs/spring/4.1.3.RELEASE/javadoc-api/org/springframework/messaging/simp/user/DefaultUserDestinationResolver.html
这会将您的路径从 /queue/position-updates 解析为 /queue/position-updates-username1234 这样的唯一路径
然后,当您要发送消息时,其中 trade.getUsername() 将替换您为频道名称选择的唯一 ID
public void afterTradeExecuted(Trade trade) {
this.messagingTemplate.convertAndSendToUser(
trade.getUserName(), "/queue/position-updates", trade.getResult());
}
最后,在订阅时,您需要确保客户端订阅了正确的主题。这可以通过标头或 Json 消息向用户发送队列后缀来完成。
client.connect('guest', 'guest', function(frame) {
var suffix = frame.headers['queue-suffix'];
client.subscribe("/queue/error" + suffix, function(msg) {
// handle error
});
client.subscribe("/queue/position-updates" + suffix, function(msg) {
// handle position update
});
});