第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何有效地設(shè)置MQTT的連接超時(shí)?

如何有效地設(shè)置MQTT的連接超時(shí)?

Go
HUWWW 2022-09-05 09:46:06
我想確保我的程序在無法連接到MQTT服務(wù)器時(shí)崩潰。為此,我將ConnectTimeout設(shè)置為10秒,但是當(dāng)連接到不存在的服務(wù)器(名稱不存在)時(shí),對(duì)MQTT的調(diào)用掛起。package mainimport (    "fmt"    "time"    mqtt "github.com/eclipse/paho.mqtt.golang")func main() {    timeout, _ := time.ParseDuration("10s");    opts := mqtt.NewClientOptions()    opts.AddBroker("tcp://this.does.not.resolve.example.coooom:1883")    opts.SetClientID("monitor")    opts.SetOrderMatters(false)    opts.SetConnectRetry(true)    opts.SetConnectTimeout(timeout)    client := mqtt.NewClient(opts)    if token := client.Connect(); token.Wait() && token.Error() != nil {        panic(fmt.Sprintf("cannot connect to MQTT: %v", token.Error()))    }}如何正確設(shè)置超時(shí)?
查看完整描述

2 回答

?
料青山看我應(yīng)如是

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超8個(gè)贊

來自 SetConnectRetry 的文檔:


SetConnectRetry 設(shè)置連接函數(shù)在發(fā)生故障時(shí)是否會(huì)自動(dòng)重試連接(如果為 true,則 Connect 函數(shù)返回的令牌在連接啟動(dòng)或取消之前不會(huì)完成)如果 ConnectRetry 為 true,則應(yīng)在 OnConnect 處理程序中請(qǐng)求訂閱 如果設(shè)置為 TRUE,則允許在建立連接之前發(fā)布消息。


因此,何時(shí)將重試,直到成功或您停止它。不會(huì)嘗試確定錯(cuò)誤是否是永久性的,因?yàn)檫@非常困難(例如,無法解決可能是由于互聯(lián)網(wǎng)連接丟失)。SetConnectRetry(true)Connect()this.does.not.resolve.example.coooom


注意:有一個(gè)單獨(dú)的選項(xiàng),用于控制斷開的連接(在成功建立初始連接后)是否會(huì)導(dǎo)致客戶端自動(dòng)重新建立連接。SetAutoReconnect


值得注意的是,添加該選項(xiàng)的主要原因是允許用戶在連接啟動(dòng)之前發(fā)布消息(當(dāng)建立連接時(shí),它們將自動(dòng)發(fā)送)。這個(gè)想法是,您應(yīng)該能夠調(diào)用然后使用庫(kù),而不必?fù)?dān)心網(wǎng)絡(luò)狀態(tài)(顯然,如果網(wǎng)絡(luò)出現(xiàn)故障,您將不會(huì)收到消息!ConnectRetryConnect


SetConnectTimeout文檔在如何與以下各項(xiàng)交互方面可能并不像它們應(yīng)該的那樣清晰:SetConnectRetry


SetConnectTimeout 限制客戶端在超時(shí)之前嘗試打開與 MQTT 服務(wù)器的連接時(shí)將等待的時(shí)間。持續(xù)時(shí)間 0 永遠(yuǎn)不會(huì)超時(shí)。默認(rèn)值為 30 秒。目前僅在 TCP/TLS 連接上運(yùn)行。


因此,這控制了我們將等待單個(gè)連接嘗試完成的時(shí)間。每次嘗試連接時(shí)將使用此間隔(每次嘗試時(shí)重新開始)。沒有類型設(shè)置。SetConnectRetry (true)RetryConnectionsFor


來自自我回答:


...連接正確失敗(并且,如果連接斷開,客戶端仍將重新連接)


一旦調(diào)用了選項(xiàng),就無法更改選項(xiàng)(獲取選項(xiàng)的副本)。它之所以這樣做,是因?yàn)樵诓僮鬟^程中更改選項(xiàng)將導(dǎo)致不可預(yù)測(cè)的結(jié)果(例如,如果您在調(diào)用后調(diào)用,則結(jié)果將取決于調(diào)用是否已完成,這是不可預(yù)測(cè)的)。NewClient(o *ClientOptions)NewClientopts.SetConnectRetry(true)ConnectConnect


我不太確定你所說的“確保我的程序崩潰,如果它無法連接到MQTT服務(wù)器”是什么意思,但我使用的方法是如下(用適當(dāng)?shù)牟僮鞔嬲Z句) - 請(qǐng)注意,我還沒有編譯/測(cè)試這個(gè):fmt.PrintLn


package main


import (

    "fmt"

    mqtt "github.com/eclipse/paho.mqtt.golang"

    "time"

)


func main() {

    timeout, _ := time.ParseDuration("10s")

    opts := mqtt.NewClientOptions()

    opts.AddBroker("tcp://this.does.not.resolve.example.coooom:1883")

    opts.SetClientID("monitor")

    opts.SetOrderMatters(false)

    opts.SetAutoReconnect(true).SetMaxReconnectInterval(10 * time.Second)

    opts.SetConnectRetry(true)

    opts.SetConnectTimeout(timeout)

    client := mqtt.NewClient(opts)


    token := client.Connect()


    go func(token mqtt.Token) {

    for {

        done := token.WaitTimeout(1 * time.Minute)

        if done {

            if token.Error() != nil {

                fmt.Println("Connection permanently failed (most probably due to call to Disconnect)", token.Error())

            } else {

                fmt.Println("Connection established")

            }

            return // We are done!


        }

        fmt.Println("Async MQTT Connection still trying (there could be an issue!)")

        // Can call `client.Disconnect()` to cancel connection if you want to cancel the connection attempts

    }

    }(token)


    // Do some stuff - you can publish messages and the library will send them when the connection comes up

}


查看完整回答
反對(duì) 回復(fù) 2022-09-05
?
臨摹微笑

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊

opts.SetConnectRetry(true)似乎將連接放在循環(huán)中(沒有任何錯(cuò)誤消息)。通過將代碼更改為 ...


package main


import (

    "fmt"

    "time"


    mqtt "github.com/eclipse/paho.mqtt.golang"

)


func main() {

    timeout, _ := time.ParseDuration("10s");

    opts := mqtt.NewClientOptions()

    opts.AddBroker("tcp://this.does.not.resolve.example.coooom:1883")

    opts.SetClientID("monitor")

    opts.SetOrderMatters(false)

    opts.SetConnectTimeout(timeout)

    client := mqtt.NewClient(opts)

    if token := client.Connect(); token.Wait() && token.Error() != nil {

        panic(fmt.Sprintf("cannot connect to MQTT: %v", token.Error()))

    }

    opts.SetConnectRetry(true)

}


...連接正確失?。ú⑶遥绻B接斷開,客戶端仍將重新連接)


編輯:我不認(rèn)為在連接嘗試后移動(dòng)會(huì)使其自動(dòng)重新連接(因?yàn)橐呀?jīng)使用了這些選項(xiàng))。這是第22條軍規(guī)的情況。opts.SetConnectRetry(true)


查看完整回答
反對(duì) 回復(fù) 2022-09-05
  • 2 回答
  • 0 關(guān)注
  • 2196 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)