1.环境asp.net core mvc 7.0,内置后台通信mqtt客户端,前端采用websock消息推送
2.网站在运行一段时间(1天左右),会出现mqtt连接断开。经排查,是整个web端出现了假死现像。但只要在网页上点击,通信又立马恢复过来。过段时间不看网站又呈现假死状态
1.使用的是自带的控制台kestel
2.websocket有重连机制
以下是相关代码
//websocket部分
var ws;
window.onload = function () {
var host = window.location.host;
var protocol = window.location.protocol === "https:" ? "wss://" : "ws://";
var wsUrl = protocol + host + "/ws";
var timeConnect = 0;
var lockReconnect = false;//避免重复连接
webSocketInit(wsUrl);
//socket初始化
function webSocketInit(service) {
ws = new WebSocket(wsUrl);
ws.onopen = function (e) {
console.log("Server > connection open.");
};
ws.onmessage = function (e) {
}
ws.onerror = function (e) {
console.log("Server > connection err.");
reconnect(service);
};
ws.onclose = function (e) {
//commonUtil.alert("Server connection closed", "danger");
reconnect(service);
console.log("Server > connection closed.");
};
}
// 重连
function reconnect(service) {
// lockReconnect加锁,防止onclose、onerror两次重连
if (lockReconnect) return;
lockReconnect = true;
// 进行重连
setTimeout(function () {
//timeConnect++;
console.log("正在重连,当前时间" + new Date());
//console.log("第" + timeConnect + "次重连");
webSocketInit(service);
}, 5000);
}
// 心跳 * 回应
setInterval(function () {
var websocket = new WebSocket(ws);
websocket.send('');
}, 1000 * 100)
}
//mqtt部分
var builder1 = new MqttClientOptionsBuilder()
.WithTcpServer(Host, 1883)
.WithClientId(Id1)
.WithCleanSession(true)
.WithCredentials("", "");
IManagedMqttClientOptions options1 = new ManagedMqttClientOptionsBuilder()
.WithAutoReconnectDelay(TimeSpan.FromSeconds(5))
.WithClientOptions(builder1.Build()).Build();
mqttClient1.UseDisconnectedHandler(dc => {
return Task.CompletedTask;
});
mqttClient1.UseConnectedHandler(async ee =>
{
Console.WriteLine($"{DateTime.Now.ToString()} >>> {Id1} 连接到服务");
// 订阅主题
List<MqttTopicFilter> lstTopics = new List<MqttTopicFilter>();
try
{
lstTopics.add(......);
}
catch (Exception ex)
{
}
await mqttClient1.SubscribeAsync(lstTopics);
});
mqttClient1.UseApplicationMessageReceivedHandler(async m =>
{
var clientID = m.ClientId;
var topic = m.ApplicationMessage.Topic;
Console.WriteLine($"{DateTime.Now.ToString()} {clientID} 接收到主题:" + topic);
if (topic != null)
{
try
{
}
}