我使用ng2-stomp-service订阅套接字:
this.fooSubscription = this.stomp.subscribe('/topic/foo', (res) => {
console.log('do stuff with res');
});
有时连接丢失了,我看到了#34;哎呀!连接丢失。重新连接..."
此时,Stomp会自动重新连接,但它永远不会重新订阅,因此我可以再次开始接收数据。
在Stomp自动重新建立连接后如何重新订阅,以便我可以再次开始接收数据?
答案 0 :(得分:1)
Stomp Service尝试在调用onError
方法时重新连接。
我解决了覆盖控制器中StompService类的onError
方法的问题:
/**
* Unsuccessfull connection to server
*/
public onError = (error: string ) => {
console.error(`Error: ${error}`);
// Check error and try reconnect
if (error.indexOf('Lost connection') !== -1) {
if(this.config.debug){
console.log('Reconnecting...');
}
this.timer = setTimeout(() => {
this.startConnect();
}, this.config.recTimeout || 5000);
}
}
以下内容:
this.stompService.onError = (error: string) => {
console.error(`Error: ${error}`);
// Check error and try reconnect
if (error.indexOf('Lost connection') !== -1) {
console.log('Reconnecting...');
this.timer = setTimeout(() => {
this.stompService.startConnect().then(() => {
// ADD HERE THE SUBSCRIPTIONS
this.socketSubscription = this.stompService.subscribe('/topic/foo', this.response);
}).catch(err => console.error('Connessione al socket non riuscita'));
}, this.stompService.config.recTimeout || 5000);
}
}
将订阅添加到startConnect().then()
。
答案 1 :(得分:0)
我仍然愿意接受这方面的建议,但就目前而言,我想分享一下我目前解决这个问题的方式。
在stomp对象上,我注意到有几个属性,包括另一个名为stomp
的对象。在那里,我找到了一个名为subscriptions
的对象,它为每个当前订阅都有一个属性(以字符串' sub - '后跟一个数字命名,表示订阅的索引...所以第一个订阅是sub-0
'。如果重新连接,所有这些属性都会被删除,从而产生一个空对象。
所以在我的代码中,我所做的就是(每秒一次)通过检查订阅属性是否具有任何属性来检查我是否需要重新订阅。
setInterval(() => {
if (this.stomp.status === 'CONNECTED' && !this.stomp.stomp.subscriptions['sub-0']) {
this.reestablishSubscriptions();
}, 1000);
reestablishSubscriptions() {
this.mySubscription = this.stomp.subscribe('/topic/foo', (res) => {
// do stuff with subscription responses
}
this.myOtherSubscription = this.stomp.subscribe('/topic/foo2', (res) => {
// do stuff with subscription responses
}
}
是的,这很难看......但这就是为什么我仍然愿意接受建议。