Spring Websocket(ActiveMQ):Stomp订阅并获取从主题排队的消息

时间:2018-05-25 21:23:04

标签: spring activemq stomp spring-websocket

我正在使用Spring WebSocketStomp

注意:经纪人为ActiveMQ

我有两种@Schedule方法分别向QueueTopic发送消息

对于Queue的订阅,代码如下:

$('#ws_connect').click(function(){

    console.log('Connect clicked');

    var socket = new SockJS('/project-app/ws/notification');

    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        console.log('Connected: ' + frame);
        $('#notification').append('<p>Connected</p>');
        stompClient.subscribe('/queue/somedestination', function (notification) {
            ... append the content to the html page, it works
        });
    });

});

如果没有用户,Queue正在逐条消息。用户到达并进行连接后,会自动将所有消息排入并将Queue传递为空。如果新消息到达,它会自动显示,因为用户仍然保持连接状态。如果用户断开连接并稍后进行连接,则可以再次查看排队的所有消息。直到这里一切都好的

如下订阅Topic

$('#ws_connect').click(function(){

    console.log('Connect clicked');

    var socket = new SockJS('/project-app/ws/notification');

    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        console.log('Connected: ' + frame);
        $('#notification').append('<p>Connected</p>');
        stompClient.subscribe('/topic/somedestination', function (notification) {
            ... append the content to the html page, it works
        });
    });

});

实际上js代码与Queue版本相同。只是目的地不同。

此处问题Topic中存在消息排队,如果用户进行连接,则消息不会自动显示。当然,同时用户保持连接他可以看到每个新消息,如果多个用户连接到同一个Topic,则所有人都可以看到相同的新消息。

但是第一个用户再次连接到Topic目的地。当他进行连接时,他无法从Topic获取消息入队

  • 这是正常行为吗?
  • 如何检索排队的消息
  • 也许是一种处理这种情况的建议方法? 在某种程度上,“最差”场景将为每个潜在用户创建多个Queue。但只是好奇,如果通过Topic可以得到这个requeriment

1 个答案:

答案 0 :(得分:1)

当没有订阅者时,主题目标不会存储消息,因此代码按预期工作。主题为订阅者保留消息的唯一时间是订阅者创建了持久主题订阅然后脱机,此时代理将存储发送到启用持久标志的主题的任何消息。这里需要注意的是,在订阅之前发送到该主题的任何消息都将被删除。

有关更多帮助,请参阅documentation