1.前端在websocket連接后端時,沒有帶token,后端報錯并寫入日志,前后端無法連接時,前端不斷的發(fā)請求試圖去連接,后端不斷寫日志,然后后端日志撐爆了。
原因:連接關閉后xhr_streaming無限循環(huán)。根據(jù)sockjs-client的說明,如果客戶端采用websocket連接不上服務器,它可以回退選擇其他傳輸方案比如xhr_streaming等等
解決一:在sockjs-client上GitHub的issue上面看到了解決方法
let sock = new SockJS(httpaddres);
var _transportClose = sock._transportClose;
sock._transportClose = function(code, reason) {
if (this._transport && this._transport.close) {
this._transport.close();
}
_transportClose.call(this, code, reason);
}
我看到這已在master中修復,但在1.1.4中沒有。我用的就是1.1.4
解決二:配置option中的transports。
new SockJS('http://arcs.dev.nicai.com', null, {transports:['websocket']})
transports:此選項允許您提供可由SockJS使用的列表傳輸。默認情況下,所有可用的傳輸都將被使用,但有時需要禁用一些回退傳輸是有用的。
2.服務器連接不上,重連機制
項目采用的方案是采用試圖連接10次,每次間隔時間逐漸延長的機制進行重連
代碼示例
getnewjq(count) {
let num=count||1;
let httpaddres = policeApi.sockpoliceAddress;
let sock = new SockJS(httpaddres);
this.stomp = Stomp.over(sock);
this.stomp.connect(
"guest",
"guest",
frame => {
this.stomp.subscribe(
"/user/topic/pd_warning_newest/",
this.refreshjq
);
},
error => {
if (num < 10) {
setTimeout(() => {
this.getnewjq(num + 1);
}, 10000 * num);
} else {
console.log("放棄重連了");
}
}
);
},
});
},
3.stomp心跳機制
stomp默認的心跳為10000ms,
heartbeat.outgoing:客戶端發(fā)給服務端的心跳,* 0表示它不能發(fā)送心跳 * 否則它是能保證兩次心跳的最小毫秒數(shù)
heartbeat.incoming:客戶端希望服務端發(fā)送的心跳。* 0表示它不想接收心跳 * 否則它表示兩次心跳期望的毫秒數(shù)
CONNECT
heart-beat:<cx>,<cy> 客戶端
CONNECTED:
heart-beat:<sx>,<sy> 服務端
對于client發(fā)送server的心跳: * 如果<cx>為0(client不能發(fā)送心跳)或者<sy>為0(server不想接收心跳),將不起任何作用。心跳頻率為MAX(<cx>,<sy>)毫秒數(shù).
對于server發(fā)送client的心跳:心跳頻率為MAX(<cy>,<sx>)毫秒數(shù).