scala でリトライ処理を書いてみました。
例外処理は,Option に翻訳しており,処理に失敗したときは,None になります。
object Retry {
def run[A](f: => A)(count: Int, interval: Int = 3000): Option[A] = {
exec(f) match {
case result: Some[_] => result
case None if count >= 1 => Thread.sleep(interval); run(f)(count - 1, interval)
case None => None
}
}
private def exec[A](f: => A): Option[A] = {
try {
Some(f)
} catch {
case _ => None
}
}
}
使い方は,次のような感じで。
import org.scalatest.FunSpec
class RetrySpec extends FunSpec {
describe("Usage") {
it("通常呼び出し") {
val result = Retry.run {
1 + 2
}(1)
assert(result === Some(3))
}
it("1秒間隔で3回リトライ") {
val result = Retry.run {
"some error occured"(999)
}(3, 1000)
assert(result === None)
}
}
}
ソースコードはこちら。
https://github.com/dnoguchi/retry-handler
0 件のコメント:
コメントを投稿