diff --git a/docs/retry.md b/docs/retry.md new file mode 100644 index 0000000..9e678da --- /dev/null +++ b/docs/retry.md @@ -0,0 +1,236 @@ +# 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/retry" +) +``` + + + +## Index +- [Context](#Context) +- [Retry](#Retry) +- [RetryFunc](#RetryFunc) +- [RetryDuration](#RetryDuration) +- [RetryTimes](#RetryTimes) + + + +## Documentation + + +### Context +Set retry context config, can cancel the retry with context.
+ +Signature: + +```go +func Context(ctx context.Context) +``` +Example: + +```go +import ( + "context" + "errors" + "fmt" + "lancet-demo/retry" + "time" +) + +func main() { + ctx, cancel := context.WithCancel(context.TODO()) + var number int + increaseNumber := func() error { + number++ + if number > 3 { + cancel() + } + return errors.New("error occurs") + } + + err := retry.Retry(increaseNumber, + retry.RetryDuration(time.Microsecond*50), + retry.Context(ctx), + ) + + if err != nil { + fmt.Println(err) //retry is cancelled + } +} +``` + + + + +### RetryFunc +Function that retry executes.
+ +Signature: + +```go +type RetryFunc func() error +``` +Example: + +```go +package main + +import ( + "fmt" + "errors" + "log" + "github.com/duke-git/lancet/retry" +) + +func main() { + var number int + var increaseNumber retry.RetryFunc + increaseNumber = func() error { + number++ + if number == 3 { + return nil + } + return errors.New("error occurs") + } + + err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50)) + if err != nil { + log.Fatal(err) + } + + fmt.Println(number) //3 +} +``` + + + +### RetryTimes +Set times of retry. Default times is 5.
+ +Signature: + +```go +func RetryTimes(n uint) +``` +Example: + +```go +package main + +import ( + "fmt" + "errors" + "log" + "github.com/duke-git/lancet/retry" +) + +func main() { + var number int + increaseNumber := func() error { + number++ + if number == 3 { + return nil + } + return errors.New("error occurs") + } + + err := retry.Retry(increaseNumber, retry.RetryTimes(2)) + if err != nil { + log.Fatal(err) //2022/02/01 18:42:25 function main.main.func1 run failed after 2 times retry exit status 1 + } +} +``` + + + +### RetryDuration +Set duration of retries. Default duration is 3 second.
+ +Signature: + +```go +func RetryDuration(d time.Duration) +``` +Example: + +```go +package main + +import ( + "fmt" + "errors" + "log" + "github.com/duke-git/lancet/retry" +) + +func main() { + var number int + increaseNumber := func() error { + number++ + if number == 3 { + return nil + } + return errors.New("error occurs") + } + + err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50)) + if err != nil { + log.Fatal(err) + } + + fmt.Println(number) //3 +} +``` + + +### Retry +Executes the retryFunc repeatedly until it was successful or canceled by the context.
+ +Signature: + +```go +func Retry(retryFunc RetryFunc, opts ...Option) error +``` +Example: + +```go +package main + +import ( + "fmt" + "errors" + "log" + "github.com/duke-git/lancet/retry" +) + +func main() { + var number int + increaseNumber := func() error { + number++ + if number == 3 { + return nil + } + return errors.New("error occurs") + } + + err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50)) + if err != nil { + log.Fatal(err) + } + + fmt.Println(number) //3 +} +``` diff --git a/docs/retry_zh-CN.md b/docs/retry_zh-CN.md new file mode 100644 index 0000000..23f136e --- /dev/null +++ b/docs/retry_zh-CN.md @@ -0,0 +1,238 @@ +# Retry +retry重试执行函数直到函数运行成功或被context cancel。 + + + +## 源码: + +[https://github.com/duke-git/lancet/blob/main/retry/retry.go](https://github.com/duke-git/lancet/blob/main/retry/retry.go) + + + + +## 用法: +```go +import ( + "github.com/duke-git/lancet/retry" +) +``` + + + +## 目录 +- [Context](#Context) +- [Retry](#Retry) +- [RetryFunc](#RetryFunc) +- [RetryDuration](#RetryDuration) +- [RetryTimes](#RetryTimes) + + + + + +## Document文档 + + +### Context +设置重试context参数
+ +函数签名: + +```go +func Context(ctx context.Context) +``` +例子: + +```go +import ( + "context" + "errors" + "fmt" + "lancet-demo/retry" + "time" +) + +func main() { + ctx, cancel := context.WithCancel(context.TODO()) + var number int + increaseNumber := func() error { + number++ + if number > 3 { + cancel() + } + return errors.New("error occurs") + } + + err := retry.Retry(increaseNumber, + retry.RetryDuration(time.Microsecond*50), + retry.Context(ctx), + ) + + if err != nil { + fmt.Println(err) //retry is cancelled + } +} +``` + + + + +### RetryFunc +被重试执行的函数
+ +函数签名: + +```go +type RetryFunc func() error +``` +例子: + +```go +package main + +import ( + "fmt" + "errors" + "log" + "github.com/duke-git/lancet/retry" +) + +func main() { + var number int + var increaseNumber retry.RetryFunc + increaseNumber = func() error { + number++ + if number == 3 { + return nil + } + return errors.New("error occurs") + } + + err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50)) + if err != nil { + log.Fatal(err) + } + + fmt.Println(number) //3 +} +``` + + + +### RetryTimes +设置重试次数,默认5
+ +函数签名: + +```go +func RetryTimes(n uint) +``` +例子: + +```go +package main + +import ( + "fmt" + "errors" + "log" + "github.com/duke-git/lancet/retry" +) + +func main() { + var number int + increaseNumber := func() error { + number++ + if number == 3 { + return nil + } + return errors.New("error occurs") + } + + err := retry.Retry(increaseNumber, retry.RetryTimes(2)) + if err != nil { + log.Fatal(err) //2022/02/01 18:42:25 function main.main.func1 run failed after 2 times retry exit status 1 + } +} +``` + + + +### RetryDuration +设置重试间隔时间,默认3秒
+ +函数签名: + +```go +func RetryDuration(d time.Duration) +``` +例子: + +```go +package main + +import ( + "fmt" + "errors" + "log" + "github.com/duke-git/lancet/retry" +) + +func main() { + var number int + increaseNumber := func() error { + number++ + if number == 3 { + return nil + } + return errors.New("error occurs") + } + + err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50)) + if err != nil { + log.Fatal(err) + } + + fmt.Println(number) //3 +} +``` + + +### Retry +重试执行函数retryFunc,直到函数运行成功,或被context停止
+ +函数签名: + +```go +func Retry(retryFunc RetryFunc, opts ...Option) error +``` +例子: + +```go +package main + +import ( + "fmt" + "errors" + "log" + "github.com/duke-git/lancet/retry" +) + +func main() { + var number int + increaseNumber := func() error { + number++ + if number == 3 { + return nil + } + return errors.New("error occurs") + } + + err := retry.Retry(increaseNumber, retry.RetryDuration(time.Microsecond*50)) + if err != nil { + log.Fatal(err) + } + + fmt.Println(number) //3 +} +```