4

我正在使用 RabbitMQ 作为代理创建一个 spring websocket 应用程序。有没有办法过滤用户将在频道上看到的 Web 套接字消息?

多人将订阅该频道。

4

1 回答 1

2

为了能够在 Spring 中向通过 Web Sockets 连接的特定用户发送消息,您可以将 @SendToUser 注释与 SimpMessagingTemplate 结合使用

参考可以在这里找到 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-stomp-user-destination

但简而言之(取自参考)首先设置您的主题

@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
  });

});
于 2015-07-08T16:31:43.530 回答