外部のWeb APIにアクセスするためにPlay WSを使って下記のようなコードを実装していたのですが、
import play.api.libs.ws._
import play.api.Play.current
import scala.concurrent._
import scala.concurrent.duration.{ Duration, MILLISECONDS }
val futureResponse: Future[WSResponse] = WS.url("http://example.com").get()
val response: WSResponse = Await.result(futureResponse, Duration(5000, MILLISECONDS))
このコードをPlayアプリケーションが起動していないバッチ処理などから呼びだそうとするとRuntimeException: There is no started application
というエラーが発生してしまいました。
そこで下のリンクなどを参考に
http://stackoverflow.com/questions/24881145/how-do-i-use-play-ws-library-in-normal-sbt-project-instead-of-play
下記のように修正することでHttpリクエストは正常に実行されるようになったのですが、
import play.api.libs.ws._
import com.ning.http.client.AsyncHttpClientConfig
import play.api.libs.ws.ning.NingWSClient
import scala.concurrent._
import scala.concurrent.duration.{ Duration, MILLISECONDS }
import scala.concurrent.ExecutionContext.Implicits.global
val builder = new AsyncHttpClientConfig.Builder()
val client = new NingWSClient(builder.build())
val futureResponse: Future[WSResponse] = client.url("http://example.com").get()
val response: WSResponse = Await.result(futureResponse, Duration(5000, MILLISECONDS))
このままだと処理が終了してもプログラムが終了してくれなかったため、上記のコードを下記のように修正し、
~~
val futureResponse: Future[WSResponse] = client.url("http://example.com").get()
futureResponse.onComplete(_ => client.close())
val response: WSResponse = Await.result(futureResponse, Duration(5000, MILLISECONDS))
作成したWSClientのclose
をHttpリクエスト終了後に呼び出してやることで、プログラムも正常に終了してくれるようになり、Playを起動していない状態でもPlay WSをHttpクライアントを利用することができました。