1 个不稳定版本

0.1.0 2022年10月14日

#1538异步

MIT/Apache

17KB
316

Async Retry

该库的主要目的是重复可能包含复杂场景的 Futures,这不仅包括处理错误,还包括任何应该重复的内容。这可能包括重复 HTTP 请求中的 500 错误或重复类似“伪”成功的内容。

有关示例,请检查 examples/ 目录,但这里有一个示例

// imports...
use async_retry::{
    AsyncRetry, RetryPolicy, ExponentialRetryStrategy
};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let resp = AsyncRetry::new(
        || async {
            let resp = reqwest::get("https://127.0.0.1:8080").await?;
            match resp.status() {
                StatusCode::OK => Ok(resp),
                StatusCode::BAD_REQUEST | StatusCode::FORBIDDEN => Err(RetryPolicy::Fail(
                    String::from("Cannot recover from these kind of errors ._."),
                )),
                StatusCode::INTERNAL_SERVER_ERROR => Err(RetryPolicy::Repeat(None)),
                StatusCode::UNAUTHORIZED => {
                    // What if authorization server lies us?! Repeat it to be convinced
                    let maybe_response_text = resp.text().await.ok().map(anyhow::Error::msg);  // debug info
                    Err(RetryPolicy::Repeat(maybe_response_text))
                }
                _ => Err(RetryPolicy::Fail(format!("Some unusual response here: {resp:?}"))),
            }
        },
        ExponentialRetryStrategy::new()
            .max_attempts(5)
            .initial_delay(Duration::from_millis(100)),
    )
    .await?;

    eprintln!("resp = {:#?}", resp);

    Ok(())
}

许可证

根据您的选择,许可协议为

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义,您提交的任何有意包含在作品中的贡献,将按照上述方式双重许可,不附加任何额外条款或条件。

依赖

~3–5MB
~81K SLoC