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

Javascript 通过STOMP复制事件Socket.io和Node.js,javascript,node.js,websocket,socket.io,stomp,Javascript,Node.js,Websocket,Socket.io,Stomp,我需要一些关于node.js+socket.io实现的帮助 此服务公开通过STOMP协议连接到ActiveMQ代理的服务器,使用STOMP js node.js模块接收事件;然后通过使用socket.io的WebSocket在web前端显示 所以,在我开始使用ActiveMQ的过滤器功能之前,一切都很好,但这并不是失败点,因为我和我的团队进行了研究,我们找到了确保实现良好的方法,问题在于连接:所以,我收到了要订阅的过滤器,我成功地订阅了,但当我收到一组新的筛选器时,就会出现重复、三次重复和越来越

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

此服务公开通过STOMP协议连接到ActiveMQ代理的服务器,使用STOMP js node.js模块接收事件;然后通过使用socket.io的WebSocket在web前端显示

所以,在我开始使用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();
函数显式强制重新连接