My favorite #golang retry function
func retry(attempts int, sleep time.Duration, callback func() error) (err error) {
for i := 0; ; i++ {
err = callback()
if err == nil {
return
}
if i >= (attempts - 1) {
break
}
time.Sleep(sleep)
log.Println("retrying after error:", err)
}
return fmt.Errorf("after %d attempts, last error: %s", attempts, err)
}
func retryDuring(duration time.Duration, sleep time.Duration, callback func() error) (err error) {
t0 := time.Now()
i := 0
for {
i++
err = callback()
if err == nil {
return
}
delta := time.Now().Sub(t0)
if delta > duration {
return fmt.Errorf("after %d attempts (during %s), last error: %s", i, delta, err)
}
time.Sleep(sleep)
log.Println("retrying after error:", err)
}
}
use
var signedContent []byte
err := retry(5, 2*time.Second, func() (err error) {
signedContent, err = signFile(unsignedFile, contents)
return
})
if err != nil {
log.Println(err)
http.Error(w, err.Error(), 500)
return
}
相关github地址
https://github.com/giantswarm/retry-go
https://github.com/cenkalti/backoff
还没有评论,来说两句吧...