代码
以下实现了两个方法,分别是
- 设定最大重试次数,对一个方法进行重试
- 设定最大重试时间,对一个方法进行重试
//重试,限制次数
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
", name, i, err)
time.Sleep(sleep)
}
err = fmt.Errorf("[%v]失败,共重试%d次, 最近一次错误:%s
", 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
", name, max, i, err)
return err
}
time.Sleep(sleep)
i++
fmt.Printf("[%v]失败,第%v次重试, 错误信息:%s
", 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~