2 回答
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
}
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)
- 2 回答
- 0 關(guān)注
- 2196 瀏覽
添加回答
舉報(bào)
