-
Notifications
You must be signed in to change notification settings - Fork 0
/
retry.go
48 lines (39 loc) · 1.01 KB
/
retry.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package tools
import "time"
// NewRetry Создает новую структуру для повторения задачи
// в случае ошибки
func NewRetry(log Logger, max int, delay time.Duration) *Retry {
return &Retry{
log: log,
max: max,
delay: delay,
}
}
type Retry struct {
log Logger
max int
delay time.Duration
}
// Do выполняет задачу и в случае ошибки повторяет ее
// max раз с задержкой delay
func (r *Retry) Do(task func() error) error {
var (
taskID = NewID()
err error
)
r.log.Logf("[DEBUG] task %v started", taskID)
for i := 0; i < r.max; i++ {
if i > 0 {
r.log.Logf("[DEBUG] task %v retry %v", taskID, i)
}
err = task()
if err == nil {
r.log.Logf("[DEBUG] task %v finished", taskID)
break
}
retryDelay := r.delay * time.Duration(i)
r.log.Logf("[ERROR] task %v failled. retrying after %v seconds. error: %v", taskID, retryDelay.Seconds(), err)
time.Sleep(retryDelay)
}
return err
}