【问题标题】:Dynamic queues not created when subscribing to topic Spring WebSocket with STOMP?使用STOMP订阅主题Spring WebSocket时未创建动态队列?
【发布时间】:2015-03-12 12:19:08
【问题描述】:

我正在为订阅特定事件的所有用户子集开发推送通知。 用户订阅 RabbitMQ 中的主题,格式为:user-id.event-type.id。 我在前端 SockJS 和 Angular JS 上使用 Spring Websocket、Stomp、RabbitMQ。 应通知用户有关事件的所有操作(cmets 等、日期更改)。

到目前为止我们所拥有的:

首先我通过 REST Web 服务端点进行身份验证,并将我的令牌放入 Cookie。然后我们连接到 网络套接字。用户订阅主题 (/topic/user-45.meeting.1235) 并收到通知。但我的问题是一些用户没有收到通知。对于第二个用户,由于某种原因,RabbitMQ 中没有创建队列。有谁知道为什么?

这是我在 Spring applicationContext.xml 中的代理设置:

<websocket:message-broker application-destination-prefix="/app">
        <websocket:stomp-endpoint path="/stomp">
            <websocket:sockjs/>
        </websocket:stomp-endpoint>
        <websocket:stomp-broker-relay relay-host="localhost" relay-port="61613" system-login="guest" system-passcode="guest" prefix="/queue, /topic"/>
    </websocket:message-broker>

这就是通过 Sockjs 订阅的方式:

var ws = new SockJS('http://' + location.host + path);
var stompClient = Stomp.over(ws);
stompClient.connect({
    username: '',
    password: '',
    host: '/'
}, function () {
    stompClient.subscribe('/topic/user-45.meeting.' + obj.id,
        function (message) {
            console.log(message);
        }, {
            persistent: true
        });
});

更新

如果我们在 SUBSCRIBE 帧中指定唯一的 Id 字段,它会为每个用户创建唯一的队列。这是要走的路吗?

【问题讨论】:

  • 没有。不同的机器。
  • 您能否使用 Java(不是 Websocket)客户端重现“未创建队列”错误?

标签: spring rabbitmq stomp sockjs spring-websocket


【解决方案1】:

据我所知,您需要订阅 \queue 而不是 \topic。通过这样做,您无需为不同的用户自定义主题名称,这将由 sockjs 根据登录的用户进行处理。在服务器上你也可以使用\queue\user\{username}\{name of queue}向特定用户发送消息

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 2018-09-11
    • 1970-01-01
    • 2021-04-22
    • 2016-11-09
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多