STOMP 上的重复事件 Socket.io 和 Node.js

Posted

技术标签:

【中文标题】STOMP 上的重复事件 Socket.io 和 Node.js【英文标题】:Duplicate Events Socket.io and Node.js over STOMP 【发布时间】:2013-02-07 19:20:19 【问题描述】:

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

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

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

所以进行一些调试,我看不出有什么问题,但我几乎可以肯定这是回调或程序流程的一些错误实现,我将附上我的代码来阅读你的 cmets。

非常感谢!

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);
);

);

【问题讨论】:

【参考方案1】:

查看 Socket.IO 文档,我发现这是一个已知问题(我认为是严重的已知问题),他们还没有修复它。因此,要纠正这个问题,需要重新连接到客户端的套接字以避免重复消息,使用:

socket.socket.reconnect();

明确强制重新连接的函数。

【讨论】:

以上是关于STOMP 上的重复事件 Socket.io 和 Node.js的主要内容,如果未能解决你的问题,请参考以下文章

事件上的 C++ 侦听器未使用套接字 io C++ 客户端获取事件

找不到 socket.io.js [重复]

socket.io:没有触发断开事件

Nodejs 得到 throw er; // 未处理的“错误”事件 [重复]

Socket.io被误解了[重复]

使用 Angular 的单页应用程序引擎时依赖 socket.io/express.io 中的“断开连接”事件