2010年2月18日木曜日

[Scala][GAE] URLFetchのリトライ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Scala勉強会@東北で取り上げていたquerulousRetryingQueryにインスパイアされて、GAEのURLFetchをリトライするコードを書いてみた。

URLFetchがIOExceptionを投げるか、ステータス500が返ってきた場合にリトライ。
import com.google.appengine.api.urlfetch._

val UFS = URLFetchServiceFactory.getURLFetchService()
def retryingURLFetch[A](r: HTTPRequest, retry: Int)(f: HTTPResponse => A): A = {
  try {
    val res = UFS.fetch(r)
    res.getResponseCode match {
      case 500 =>
        if (retry <= 0) f(res)
        else retryingURLFetch(r, retry - 1)(f)
      case _ => f(res)
    }
  } catch {
    case e: java.io.IOException =>
      if (retry <= 0) throw e
      retryingURLFetch(r, retry - 1)(f)
  }
}

使用例

import java.net.URL
import com.google.appengine.api.urlfetch._

retryingURLFetch(new HTTPRequest(new URL("http://pomu0325.blogspot.com")), 2) {
  res => println(new String(res.getContent, "utf-8"))
}
不安定なAPIを呼ぶ時とかに使えそう。

0 件のコメント:

コメントを投稿