代碼
以下實現了兩個方法,分別是
- 設定最大重試次數,對一個方法進行重試
- 設定最大重試時間,對一個方法進行重試
//重試,限制次數
func RetryTimes(name string, tryTimes int, sleep time.Duration, callback func() error) (err error) {
for i := 1; i <= tryTimes; i++ {
err = callback()
if err == nil {
return nil
}
fmt.Printf("[%v]失敗,第%v次重試, 錯誤信息:%s \n", name, i, err)
time.Sleep(sleep)
}
err = fmt.Errorf("[%v]失敗,共重試%d次, 最近一次錯誤:%s \n", name, tryTimes, err)
fmt.Println(err)
return err
}
//重試,限制時間
func RetryDurations(name string, max time.Duration, sleep time.Duration, callback func() error) (err error) {
t0 := time.Now()
i := 0
for {
err = callback()
if err == nil {
return
}
delta := time.Now().Sub(t0)
if delta > max {
fmt.Printf("[%v]失敗,超過最大時間%s, 共重試%d次,最近一次錯誤: %s \n", name, max, i, err)
return err
}
time.Sleep(sleep)
i++
fmt.Printf("[%v]失敗,第%v次重試, 錯誤信息:%s \n", name, i, err)
}
}
使用
func main() {
//示例任務函數,只會失敗
var task = func() error {
return errors.New("task error")
}
fmt.Println("RetryTimes")
//設定3秒最大重試次數,最大3次,1秒重試一次
RetryTimes("測試任務", 3, time.Second, task)
fmt.Println("RetryDurations")
//設定3秒最大重試期限,最多3秒,1秒重試一次
RetryDurations("測試任務", 3*time.Second, time.Second, task)
}
運行結果如下
就是這么簡單粗暴,light weight baby~