かとじゅんの技術日誌

技術の話をするところ

リトライハンドラを書いてみた(Scala版)

Scalaでもリトライハンドラ*1が欲しくなったので、このブログを参考に作ってみた。
Ruby の retry-handler が激しく便利そうなので Java で実装してみた - YoshioriのBlog

試行錯誤してたら、id:xuwei がforkしてくれていた!→ https://gist.github.com/2996927
参考になりました。
allCatchのほうがよさげだったので、結局以下のような感じになった。

例えばこんな使い方ができます。ConnectExceptionもしくはIOExceptionが発生した場合は3秒間隔で3回までリトライができます(第三引数には関数も渡せます)。リトライ上限回数をオーバーした場合はRetryExceptionがスローされます。retryが成功した場合はちゃんと戻り値を取得できる。これは便利です!

import RetryUtil._

try {
  val xml = retry(3, 3000, classOf[ConnectException], classOf[IOException] ) {
    val url = new URL("http://localhost/")
    println("start")
    val conn = url.openConnection
    val result = XML.load(conn.getInputStream)
    println("end")
    result
  }
} catch {
  case e: RetryException =>
    e.throwables.foreach(_.printStackTrace())
}

*1:Scalaの場合はこの名称が適切かどうかわからんが…。