我有一个用c#编写的MQTT侦听器。该程序在Azure中运行,由于某种原因,经过一段时间后,它与一个异常不相关:“操作超时了。”或者“引发'MQTTnet.Exceptions.MqttCommunicationTimedOutException‘类型的异常”。
在生产中,监听器必须总是在线的,比如我正在重新连接的断开事件,但是这种情况是随机发生的,它一天可以断开4次,有时它可以在不断开连接的情况下停留几天。
问题是,为什么会发生这种事?它监听的设备每隔几分钟发送一个时间戳请求,但是它应该非常快,不应该导致超时。
以下是代码:
private static IMqttClient _client;
private static IMqttClientOptions _options;
static async Task Main(string[] args)
{
//create subscriber client
var factory = new MqttFactory();
_client = factory.CreateMqttClient();
//configure options
_options = new MqttClientOptionsBuilder()
.WithClientId("ListenerClient")
.WithTcpServer(Utility.brokerIp, Utility.brokerPort).WithCredentials(Utility.brokerUser, Utility.brokerPassword)
.WithCleanSession()
.Build();
//Handlers
_client.UseConnectedHandler(e =>
{
Console.WriteLine("Connected successfully with MQTT Brokers Topic.");
WriteToLog("***Connected To MQTT Listener.***");
//Subscribe to topics******************
});
_client.UseDisconnectedHandler(e =>
{
WriteToLog("***DisConnected From MQTT Listener.***");
WriteToLog(e.Exception.Message);
_client.ConnectAsync(_options).Wait();
return;
});
_client.UseApplicationMessageReceivedHandler(async e =>
{
//manage messages
});
//Connect
_client.ConnectAsync(_options).Wait();
Task.Run(() => Thread.Sleep(Timeout.Infinite)).Wait();
_client.DisconnectAsync().Wait();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
发布于 2022-08-15 06:19:55
我们曾经有过类似的问题,我相信你试图连接的队列有非常断断续续的流量。然后,不管是什么服务,或者您拥有的承载队列的服务器--它自己,都是在队列在预定时间内没有流量到达队列时,设置为休眠队列。
然后,当您尝试使用队列时,会出现“超时值”,因为队列无法从休眠状态中快速醒来,从而无法通过处理过的消息。
如果队列是由Azure托管的,请尝试获得Azure支持以确认这种情况,如果您是在托管的前提下,请尝试验证您自己的配置是这样设置的,并将“等待”时间减少到像30秒这样的“等待”时间,并验证休眠队列会导致超时。
https://stackoverflow.com/questions/73357396
复制相似问题