2012年3月25日日曜日

[scala]scala でリトライ処理

http://d.hatena.ne.jp/Yoshiori/20120315/1331825419 の記事を読んで,
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 件のコメント:

コメントを投稿