首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MQTTClient侦听器随机断开

MQTTClient侦听器随机断开
EN

Stack Overflow用户
提问于 2022-08-15 06:04:34
回答 1查看 257关注 0票数 0

我有一个用c#编写的MQTT侦听器。该程序在Azure中运行,由于某种原因,经过一段时间后,它与一个异常不相关:“操作超时了。”或者“引发'MQTTnet.Exceptions.MqttCommunicationTimedOutException‘类型的异常”。

在生产中,监听器必须总是在线的,比如我正在重新连接的断开事件,但是这种情况是随机发生的,它一天可以断开4次,有时它可以在不断开连接的情况下停留几天。

问题是,为什么会发生这种事?它监听的设备每隔几分钟发送一个时间戳请求,但是它应该非常快,不应该导致超时。

以下是代码:

代码语言:javascript
运行
复制
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;
    }
EN

回答 1

Stack Overflow用户

发布于 2022-08-15 06:19:55

我们曾经有过类似的问题,我相信你试图连接的队列有非常断断续续的流量。然后,不管是什么服务,或者您拥有的承载队列的服务器--它自己,都是在队列在预定时间内没有流量到达队列时,设置为休眠队列。

然后,当您尝试使用队列时,会出现“超时值”,因为队列无法从休眠状态中快速醒来,从而无法通过处理过的消息。

如果队列是由Azure托管的,请尝试获得Azure支持以确认这种情况,如果您是在托管的前提下,请尝试验证您自己的配置是这样设置的,并将“等待”时间减少到像30秒这样的“等待”时间,并验证休眠队列会导致超时。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73357396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档