我正在使用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
正在逐条消息。用户到达并进行连接后,会自动将所有消息排入并将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 答案 0 :(得分:1)
当没有订阅者时,主题目标不会存储消息,因此代码按预期工作。主题为订阅者保留消息的唯一时间是订阅者创建了持久主题订阅然后脱机,此时代理将存储发送到启用持久标志的主题的任何消息。这里需要注意的是,在订阅之前发送到该主题的任何消息都将被删除。
有关更多帮助,请参阅documentation。