# Retry Package retry is for executing a function repeatedly until it was successful or canceled by the context.
## Source: - [https://github.com/duke-git/lancet/blob/main/retry/retry.go](https://github.com/duke-git/lancet/blob/main/retry/retry.go) ## Usage: ```go import ( "github.com/duke-git/lancet/v2/retry" ) ``` ## Index - [Context](#Context) - [Retry](#Retry) - [RetryFunc](#RetryFunc) - [RetryDuration](#RetryDuration) - [RetryTimes](#RetryTimes) - [BackoffStrategy](#BackoffStrategy) - [RetryWithCustomBackoff](#RetryWithCustomBackoff) - [RetryWithLinearBackoff](#RetryWithLinearBackoff) - [RetryWithExponentialWithJitterBackoff](#RetryWithExponentialWithJitterBackoff) ## Documentation ### ContextSet retry context config, can cancel the retry with context.
Signature: ```go func Context(ctx context.Context) ``` Example:[Run](https://go.dev/play/p/xnAOOXv9GkS) ```go import ( "context" "errors" "fmt" "github.com/duke-git/lancet/v2/retry" "time" ) func main() { ctx, cancel := context.WithCancel(context.TODO()) number := 0 increaseNumber := func() error { number++ if number > 3 { cancel() } return errors.New("error occurs") } duration := retry.RetryDuration(time.Microsecond*50) retry.Retry(increaseNumber, duration, retry.Context(ctx), ) fmt.Println(number) // Output: // 4 } ``` ### RetryFuncFunction that retry executes.
Signature: ```go type RetryFunc func() error ``` Example:[Run](https://go.dev/play/p/nk2XRmagfVF) ```go package main import ( "fmt" "errors" "log" "github.com/duke-git/lancet/v2/retry" ) func main() { number := 0 var increaseNumber retry.RetryFunc = func() error { number++ if number == 3 { return nil } return errors.New("error occurs") } duration := retry.RetryDuration(time.Microsecond*50) err := retry.Retry(increaseNumber, duration) if err != nil { return } fmt.Println(number) // Output: // 3 } ``` ### RetryTimesSet times of retry. Default times is 5.
Signature: ```go func RetryTimes(n uint) ``` Example:[Run](https://go.dev/play/p/ssfVeU2SwLO) ```go package main import ( "fmt" "errors" "log" "github.com/duke-git/lancet/v2/retry" ) func main() { number := 0 increaseNumber := func() error { number++ if number == 3 { return nil } return errors.New("error occurs") } err := retry.Retry(increaseNumber, retry.RetryTimes(2)) if err != nil { fmt.Println(err) } // Output: // function main.main.func1 run failed after 2 times retry } ``` ### RetryDurationSet duration of retries. Default duration is 3 second.
Signature: ```go func RetryDuration(d time.Duration) ``` Example:[Run](https://go.dev/play/p/nk2XRmagfVF) ```go package main import ( "fmt" "errors" "log" "github.com/duke-git/lancet/v2/retry" ) func main() { number := 0 increaseNumber := func() error { number++ if number == 3 { return nil } return errors.New("error occurs") } duration := retry.RetryDuration(time.Microsecond*50) err := retry.Retry(increaseNumber, duration) if err != nil { return } fmt.Println(number) // Output: // 3 } ``` ### RetryExecutes the retryFunc repeatedly until it was successful or canceled by the context.
Signature: ```go func Retry(retryFunc RetryFunc, opts ...Option) error ``` Example:[Run](https://go.dev/play/p/nk2XRmagfVF) ```go package main import ( "fmt" "errors" "log" "github.com/duke-git/lancet/v2/retry" ) func main() { number := 0 increaseNumber := func() error { number++ if number == 3 { return nil } return errors.New("error occurs") } duration := retry.RetryDuration(time.Microsecond*50) err := retry.Retry(increaseNumber, duration) if err != nil { return } fmt.Println(number) // Output: // 3 } ``` ### BackoffStrategyAn interface that defines a method for calculating backoff intervals.
Signature: ```go // BackoffStrategy is an interface that defines a method for calculating backoff intervals. type BackoffStrategy interface { // CalculateInterval returns the time.Duration after which the next retry attempt should be made. CalculateInterval() time.Duration } ``` Example: ```go package main import ( "fmt" "errors" "log" "github.com/duke-git/lancet/v2/retry" ) type ExampleCustomBackoffStrategy struct { interval time.Duration } func (c *ExampleCustomBackoffStrategy) CalculateInterval() time.Duration { return c.interval + 1 } func main() { number := 0 increaseNumber := func() error { number++ if number == 3 { return nil } return errors.New("error occurs") } err := retry,Retry(increaseNumber, retry.RetryWithCustomBackoff(&ExampleCustomBackoffStrategy{interval: time.Microsecond * 50})) if err != nil { return } fmt.Println(number) // Output: // 3 } ``` ### RetryWithCustomBackoffSet abitary custom backoff strategy.
Signature: ```go func RetryWithCustomBackoff(backoffStrategy BackoffStrategy) Option ``` Example:[Run](https://go.dev/play/p/jIm_o2vb5Y4) ```go package main import ( "fmt" "errors" "log" "github.com/duke-git/lancet/v2/retry" ) type ExampleCustomBackoffStrategy struct { interval time.Duration } func (c *ExampleCustomBackoffStrategy) CalculateInterval() time.Duration { return c.interval + 1 } func main() { number := 0 increaseNumber := func() error { number++ if number == 3 { return nil } return errors.New("error occurs") } err := retry.Retry(increaseNumber, retry.RetryWithCustomBackoff(&ExampleCustomBackoffStrategy{interval: time.Microsecond * 50})) if err != nil { return } fmt.Println(number) // Output: // 3 } ``` ### RetryWithLinearBackoffSet linear strategy backoff.
Signature: ```go func RetryWithLinearBackoff(interval time.Duration) Option ``` Example:[Run](https://go.dev/play/p/nk2XRmagfVF) ```go package main import ( "fmt" "errors" "log" "github.com/duke-git/lancet/v2/retry" ) func main() { number := 0 increaseNumber := func() error { number++ if number == 3 { return nil } return errors.New("error occurs") } err := retry.Retry(increaseNumber, retry.RetryWithLinearBackoff(time.Microsecond*50)) if err != nil { return } fmt.Println(number) // Output: // 3 } ``` ### RetryWithExponentialWithJitterBackoffSet exponential strategy backoff.
Signature: ```go func RetryWithExponentialWithJitterBackoff(interval time.Duration, base uint64, maxJitter time.Duration) Option ``` Example:[Run](https://go.dev/play/p/xp1avQmn16X) ```go package main import ( "fmt" "errors" "log" "github.com/duke-git/lancet/v2/retry" ) func main() { number := 0 increaseNumber := func() error { number++ if number == 3 { return nil } return errors.New("error occurs") } err := retry.Retry(increaseNumber, retry.RetryWithExponentialWithJitterBackoff(time.Microsecond*50, 2, time.Microsecond*25)) if err != nil { return } fmt.Println(number) // Output: // 3 } ```