1 个不稳定版本
0.1.0 | 2022年10月14日 |
---|
#1538 在 异步
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版本 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义,您提交的任何有意包含在作品中的贡献,将按照上述方式双重许可,不附加任何额外条款或条件。
依赖
~3–5MB
~81K SLoC