1

node.js+socket.io の実装について助けが必要です。

このサービスは、stomp-js node.js モジュールを使用してイベントを受信し、STOMP プロトコルを介して ActiveMQ ブローカーに接続するサーバーを公開します。その後、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);
});

});

4

1 に答える 1

2

Socket.IO のドキュメントを見ると、これは既知の問題であり (重大な既知の問題だと思います)、まだ修正されていません。したがって、これを修正するには、クライアント側のソケットに再接続して、メッセージの重複を回避する必要があります。次を使用します。

socket.socket.reconnect();

明示的に再接続を強制する関数。

于 2013-02-11T16:50:24.223 に答える