【发布时间】:2018-11-05 07:32:13
【问题描述】:
我正在与Spring WebSocket 和Stomp 合作。
注意:经纪人是ActiveMQ
我有两个@Schedule 方法分别向Queue 和Topic 发送消息
订阅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 enqueued 和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 版本相同。只是目的地不同。
这里的问题是如果存在 messages enqueued 在Topic 中并且如果用户进行连接,则消息不会自动出现。当然,在用户保持连接的同时,他可以看到每条新消息,如果多个用户连接到同一个Topic,则同样的情况下,所有人都可以看到相同的新消息。
但是对于第一个连接到Topic 目标的用户来说。当他进行连接时,他无法从Topic 获取排队的消息。
- 这是正常行为吗?
- 如何检索排队的消息?
- 也许有建议的方法来处理这种情况?
在某种程度上,“最糟糕”的情况是为每个潜在用户创建多个
Queues。但只是好奇是否可以通过Topic获得此要求
【问题讨论】:
标签: spring activemq stomp spring-websocket