web-dev-qa-db-ja.com

Node.jsアプリケーションのStomp.jsとの自動再接続

Node.jsとExpressで記述されたアプリケーションを使用していて、 Stomp.jsクライアント を使用してActiveMQサーバーに接続しようとしています。

Stompを使用してアプリケーションをActiveMQに正常に接続することはできますが、接続に失敗したときにシステムを自動的に再接続することができません。失敗関数は、接続が最初に成功し、後で切断された場合にのみ呼び出されるようですが、Nodeアプリの起動時にActiveMQがすでにダウンしている場合は、失敗関数が呼び出されました。

var Stomp = require('stompjs');
var stompClient = Stomp.overTCP('localhost', 61612);
var stompStatus = false;

var stompSuccessCallback = function (frame) {
    stompStatus = true;
    console.log('STOMP: Connection successful');
};

var stompFailureCallback = function (error) {
    stompStatus = false;
    console.log('STOMP: ' + error);

    setTimeout(stompConnect, 10000);
    console.log('STOMP: Reconecting in 10 seconds');
};

function stompConnect() {
    console.log('STOMP: Attempting connection');
    stompClient.connect('login', 'password', stompSuccessCallback, stompFailureCallback);

}

stompConnect();

誰かがここで何が起こっているのか考えていますか?

15
Michael Oryl

Stomp.clientによって保持されているWebSocketは、一度だけ開くことができます。ネットワーク障害が発生した場合、Webソケットが閉じたままになるため、同じStompClientでの再接続は機能しません。

これはstomp.jsによって確実に改善できますが、それまでの間、障害が検出されたときにStomp.clientを再作成することでこれを回避できます。何かのようなもの:

var stompClient;

var stompFailureCallback = function (error) {
    console.log('STOMP: ' + error);
    setTimeout(stompConnect, 10000);
    console.log('STOMP: Reconecting in 10 seconds');
};

function stompConnect() {
    console.log('STOMP: Attempting connection');
    // recreate the stompClient to use a new WebSocket
    stompClient = Stomp.overTCP('localhost', 61612);
    stompClient.connect('login', 'password', stompSuccessCallback, stompFailureCallback);
}
34
jmesnil

元のsompjsは維持されなくなりました。使用してください https://github.com/stomp-js/stomp-websocket このバージョンは自動再接続をサポートしています。接続が成功するたびに、サブスクライブを実行できる接続コールバックが呼び出されます。

Angular 2、4、または5を使用している場合 https://github.com/stomp-js/ng2-stompjs このパッケージは自動再接続のみをサポートしますが、すべてのキューを再サブスクライブし、保留中のメッセージを送信します。

2
Deepak Kumar