2013-02-07 110 views
1

我需要一些關於我的node.js + socket.io實現的幫助。STOMP上的重複事件Socket.io和Node.js

此服務公開通過STOMP協議連接到ActiveMQ代理的服務器,使用stomp-js node.js模塊接收事件;然後通過使用socket.io的websockets顯示在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); 
}); 

});

回答

2

查看Socket.IO文檔,我發現這是一個已知的問題(我認爲關鍵的已知問題),他們還沒有修復它。因此,糾正,這是需要重新連接到插座中的客戶端,以避免重複的消息,使用:

socket.socket.reconnect(); 

函數強制重新連接明確。