gpt4 book ai didi

javascript - 通过 STOMP 复制事件 Socket.io 和 Node.js

转载 作者:行者123 更新时间:2023-11-30 18:10:18 26 4
gpt4 key购买 nike

我需要一些有关我的 node.js+socket.io 实现的帮助。

该服务公开了一个通过 STOMP 协议(protocol)连接到 ActiveMQ 代理的服务器,使用 stomp-js node.js 模块接收事件;然后使用 socket.io 通过 websockets 在网络前端显示。

所以,在我开始使用 ActiveMQ 的过滤器功能之前,一切都很好,但这不是故障点,因为我和我的团队正在研究,我们找到了确保实现正常的方法,问题出在连接上:事情是这样的,我收到了要订阅的过滤器,我成功订阅了,但是当我收到一组新的过滤器时,就会出现重复的、三次的和越来越多的消息,具体取决于我订阅-取消订阅的次数。

因此进行了一些调试,我看不出问题出在哪里,但我几乎可以肯定这是回调或程序流程的一些错误实现,我将附上我的代码以阅读您对此的评论。

非常感谢!

var sys = require('util');
var stomp = require('stomp');
var io = require('socket.io').listen(3000);

var socket = io.sockets.on('connection', function (socket) {

var stomp_args = {
port: 61616,
host: 'IP.ADDRESS',
debug: true,
};

var headers;
var client = new stomp.Stomp(stomp_args);
var setFilters = false;

socket.on('filtros', function (message) {

console.log('DEBUG: Getting filters');

if(setFilters){
client.unsubscribe(headers);
}
else{
client.connect();
}

var selector = '';
headers = '';

for(var attributename in message){
console.log(attributename+" : " + message[attributename]);
if(message[attributename] != ''){
selector += ' ' + attributename + '=\'' + message[attributename] + '\' AND ';
}
}

selector = selector.substring(0, selector.length - 4)
console.log('DEBUG: Selector String: ' + selector);

headers = {
destination: '/topic/virtualtopic',
ack: 'client',
selector: selector
};

if(setFilters)
client.subscribe(headers);

client.on('connected', function() {
client.subscribe(headers);
console.log('DEBUG: Client Connected');
setFilters = true;
});
});
var bufferMessage;
client.on('message', function(message) {
console.log("Got message: " + message.headers['message-id']);
var jsonMessage = JSON.parse(message.body);
if(bufferMessage === jsonMessage){
console.log('DEBUG: recibo un mensaje repetido');
return 0;
}
else{
console.log('DEBUG: Cool');
socket.emit('eventoCajero', jsonMessage);
}
client.ack(message.headers['message-id']);
bufferMessage = jsonMessage;
});

socket.on('disconnect', function(){
console.log('DEBUG: Client disconnected');
if(setFilters){
console.log('DEBUG: Consumer disconnected');
client.disconnect();
}
});
client.on('error', function(error_frame) {
console.log(error_frame.body);
});

});

最佳答案

查看 Socket.IO 文档,我发现这是一个已知问题(我认为是关键的已知问题)并且他们尚未修复它。因此,要更正此问题,必须重新连接到客户端的套接字以避免重复消息,使用:

socket.socket.reconnect();

明确强制重新连接的功能。

关于javascript - 通过 STOMP 复制事件 Socket.io 和 Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14759218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com