retry.go 672 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package retry
  2. import (
  3. "errors"
  4. "time"
  5. )
  6. var (
  7. RetryFailed = errors.New("All retry attempts failed.")
  8. )
  9. type RetryStrategy interface {
  10. On(func() error) error
  11. }
  12. type retryer struct {
  13. NextDelay func(int) int
  14. }
  15. func (r *retryer) On(method func() error) error {
  16. attempt := 0
  17. for {
  18. err := method()
  19. if err == nil {
  20. return nil
  21. }
  22. delay := r.NextDelay(attempt)
  23. if delay < 0 {
  24. return RetryFailed
  25. }
  26. <-time.After(time.Duration(delay) * time.Millisecond)
  27. attempt++
  28. }
  29. }
  30. func Timed(attempts int, delay int) RetryStrategy {
  31. return &retryer{
  32. NextDelay: func(attempt int) int {
  33. if attempt >= attempts {
  34. return -1
  35. }
  36. return delay
  37. },
  38. }
  39. }