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 件のコメント:
コメントを投稿