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()) }