在Node.js应用程序中使用Stomp.js自动重新连接

22

我正在使用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();

有人知道这里到底发生了什么吗?

2个回答

50

由Stomp.client持有的WebSocket只能打开一次。如果网络故障,使用相同的StompClient重新连接将不起作用,因为WebSockets将保持关闭。

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

1
非常感谢你,Jeff。我真的很感激你抽出时间来回答我的问题。 - Michael Oryl
1
我使用了相同的概念,但当它在中间说“糟糕!连接丢失”时,失败回调函数没有被调用。 - Vivek Sadh
嗨,Jeff(@jmesnil),我在我的应用程序中使用Stomp.js客户端。我尝试了你处理连接丢失情况的方法。虽然它重新创建了一个连接,但我无法再订阅事件了。这样做会抛出错误:“WebSocket已处于CLOSING或CLOSED状态”。请帮忙。 - Lalit
看起来你的代码中没有重新创建stompClient,或者它以某种方式被缓存了。顺便确保你正在使用最新版本的stomp.js。 - mvmn

2
原文如下:

原始的sompjs已不再维护。请使用https://github.com/stomp-js/stomp-websocket。此版本支持自动重新连接。每次成功连接时,都会调用连接回调函数,在其中可以进行订阅操作。

如果您正在使用Angular 2、4或5,请查看https://github.com/stomp-js/ng2-stompjs。该软件包不仅支持自动重新连接,而且还将重新订阅所有队列并发送任何未处理的消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接