NewLife.MQTT
NewLife.MQTT copied to clipboard
mqtt服务端重启使newlife.mqttclient崩溃
重现方式: 使用mqttclient连接mosquitto. 任务管理器中服务重启 mosquitto 然后mqttclient崩溃. 且 5秒后并不能恢复. 使用其他mqtt第三方客户端连接mosquitto正常
是否可以增加一个事件来表达 mqttserver 关闭了. 或者mqttclient close事件. 这样我们可以手动增加一个委托来让它如何重连. 其次依赖newlife.core版本一起更新一下.
var mc = new MqttClient { Log = XTrace.Log, Server = $"tcp://{ServerIP}:{Port}", UserName = Username, Password = Password, ClientId = Guid.NewGuid()+"", KeepAlive =5
};
_mc = mc;
_mc.ConnectAsync();
var rt = _mc.SubscribeAsync(PullToptic, (e) => {
XTrace.WriteLine($"sub:" + PullToptic + e.Topic + ":" + e.Payload.ToStr());
});
_mc.Received += _mc_Received;
12:06:31.272 12 Y T System.AggregateException: 发生一个或多个错误。 ---> System.Threading.Tasks.TaskCanceledException: 已取消一个任务。
--- 内部异常堆栈跟踪的结尾 ---
在 System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
在 System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
在 NewLife.MQTT.MqttClient.DoPing(Object state) 位置 D:\X\NewLife.MQTT\NewLife.MQTT\MqttClient.cs:行号 388
在 NewLife.WeakAction1.Invoke(TArgs e) 位置 D:\X\Src\NewLife.Core\Event\WeakAction.cs:行号 105 在 NewLife.Threading.TimerScheduler.Execute(Object state) 位置 D:\X\Src\NewLife.Core\Threading\TimerScheduler.cs:行号 254 12:06:33.774 14 Y T [Mqtt]正在连接[Tcp://192.168.1.222:1883] 12:06:33.775 14 Y T Tcp.Open Tcp://0.0.0.0:9410=>192.168.1.222:1883 12:06:33.778 11 Y - Tcp.Close TcpSessionDispose Tcp://0.0.0.0:9410=>192.168.1.222:1883 12:06:33.781 14 Y T System.AggregateException: 发生一个或多个错误。 ---> System.Threading.Tasks.TaskCanceledException: 已取消一个任务。 --- 内部异常堆栈跟踪的结尾 --- 在 System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 在 System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) 在 NewLife.MQTT.MqttClient.DoPing(Object state) 位置 D:\X\NewLife.MQTT\NewLife.MQTT\MqttClient.cs:行号 388 在 NewLife.WeakAction
1.Invoke(TArgs e) 位置 D:\X\Src\NewLife.Core\Event\WeakAction.cs:行号 105
在 NewLife.Threading.TimerScheduler.Execute(Object state) 位置 D:\X\Src\NewLife.Core\Threading\TimerScheduler.cs:行号 254
从错误信息来看,的确是网络断开了,且心跳是启动了重连机制,只是重连并没有成功。 待服务端恢复以后,应该可以看到重连成功的日志信息。
只要网络断开. 就会出现这个问题