Skip to content

Latest commit

 

History

History
261 lines (190 loc) · 4.07 KB

retry.md

File metadata and controls

261 lines (190 loc) · 4.07 KB

Retry

Package retry is for executing a function repeatedly until it was successful or canceled by the context.

Source:

Usage:

import (
    "github.com/gozelle/lancet/retry"
)

Index

Documentation

Context

Set retry context config, can cancel the retry with context.

Signature:

func Context(ctx context.Context)

Example:

import (
    "context"
    "errors"
    "fmt"
    "github.com/gozelle/lancet/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
}

RetryFunc

Function that retry executes.

Signature:

type RetryFunc func() error

Example:

package main

import (
    "fmt"
    "errors"
    "log"
    "github.com/gozelle/lancet/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
}

RetryTimes

Set times of retry. Default times is 5.

Signature:

func RetryTimes(n uint)

Example:

package main

import (
    "fmt"
    "errors"
    "log"
    "github.com/gozelle/lancet/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
}

RetryDuration

Set duration of retries. Default duration is 3 second.

Signature:

func RetryDuration(d time.Duration)

Example:

package main

import (
    "fmt"
    "errors"
    "log"
    "github.com/gozelle/lancet/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
}

Retry

Executes the retryFunc repeatedly until it was successful or canceled by the context.

Signature:

func Retry(retryFunc RetryFunc, opts ...Option) error

Example:

package main

import (
    "fmt"
    "errors"
    "log"
    "github.com/gozelle/lancet/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
}