retry.go 660 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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. }
  28. }
  29. func Timed(attempts int, delay int) RetryStrategy {
  30. return &retryer{
  31. NextDelay: func(attempt int) int {
  32. if attempt >= attempts {
  33. return -1
  34. }
  35. return delay
  36. },
  37. }
  38. }