【问题标题】:Spring Websocket (ActiveMQ): Stomp subscribe and get messages enqueued from a TopicSpring Websocket(ActiveMQ):Stomp 订阅并获取从主题排队的消息
【发布时间】:2018-11-05 07:32:13
【问题描述】:

我正在与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 将逐条接收消息。一旦用户到达并进行连接,它会自动将所有 messages enqueuedQueue 传递为空。如果有新消息到达,它会自动出现,这是因为用户仍然保持连接。如果用户断开连接并稍后进行连接,它可以再次看到所有排队的消息。直到这里一切都好

如下订阅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 版本相同。只是目的地不同。

这里的问题是如果存在 messages enqueuedTopic 中并且如果用户进行连接,则消息不会自动出现。当然,在用户保持连接的同时,他可以看到每条新消息,如果多个用户连接到同一个Topic,则同样的情况下,所有人都可以看到相同的新消息。

但是对于第一个连接到Topic 目标的用户来说。当他进行连接时,他无法从Topic 获取排队的消息

  • 这是正常行为吗?
  • 如何检索排队的消息
  • 也许有建议的方法来处理这种情况? 在某种程度上,“最糟糕”的情况是为每个潜在用户创建多个Queues。但只是好奇是否可以通过Topic 获得此要求

【问题讨论】:

    标签: spring activemq stomp spring-websocket


    【解决方案1】:

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

    请参阅documentation 以获取更多帮助。

    【讨论】:

    • 我明白了。因此,通过ActiveMQ Web ConsoleTopic 报告的所有messages enqueued 实际上完全被放弃了。因此似乎最好的方法是拥有多个Queues
    • 入队计数只是让您了解有多少消息已在主题中触发,但主题的机制是由 JMS 规范定义的,因此哭泣无济于事。跨度>
    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 2023-03-17
    • 2019-02-14
    • 2018-10-31
    • 2015-03-12
    • 2013-01-16
    • 2015-06-16
    • 2018-09-11
    相关资源
    最近更新 更多