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