1.前端在websocket连接后端时,没有带token,后端报错并写入日志,前后端无法连接时,前端不断的发请求试图去连接,后端不断写日志,然后后端日志撑爆了。
原因:连接关闭后xhr_streaming无限循环。根据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:客户端发给服务端的心跳,* 0表示它不能发送心跳 * 否则它是能保证两次心跳的最小毫秒数
heartbeat.incoming:客户端希望服务端发送的心跳。* 0表示它不想接收心跳 * 否则它表示两次心跳期望的毫秒数
CONNECT
heart-beat:<cx>,<cy> 客户端
CONNECTED:
heart-beat:<sx>,<sy> 服务端
对于client发送server的心跳: * 如果<cx>为0(client不能发送心跳)或者<sy>为0(server不想接收心跳),将不起任何作用。心跳频率为MAX(<cx>,<sy>)毫秒数.
对于server发送client的心跳:心跳频率为MAX(<cy>,<sx>)毫秒数.