BackON
https://gyazo.com/5637434fb568ca2ff9097c30aaf3e40a
↑なんか顔が2つあるなmrsekut.icon
retry処理するやつ
code:rs
use backon::ExponentialBuilder;
use backon::Retryable;
use std::error::Error;
use tokio;
async fn fetch() -> Result<String, Box<dyn Error + Send + Sync>> {
// エラーを返す可能性のある非同期処理
Err("一時的なエラーが発生しました".into())
}
async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
let fetch_closure = || async { fetch().await };
let content = fetch_closure
// 指数バックオフ戦略でリトライ
.retry(ExponentialBuilder::default())
// スリープ関数を指定(tokio::time::sleepを使用)
.sleep(tokio::time::sleep)
// リトライ条件を指定
.when(|e| e.to_string() == "一時的なエラーが発生しました")
// リトライ時の通知
.notify(|err, dur| {
println!("エラー: {:?}, {:?}後にリトライします", err, dur);
})
.await;
match content {
Ok(data) => println!("取得成功: {}", data),
Err(e) => println!("リトライ後も失敗しました: {}", e),
}
Ok(())
}