Scala / Akka WSResponse以递归方式调用

时间:2014-10-15 22:09:52

标签: scala playframework akka

我试图解析API中的一些数据

我有一个调用此方法的递归方法

 def getJsonValue( url: (String)): JsValue = {
 val builder = new com.ning.http.client.AsyncHttpClientConfig.Builder()
 val client = new play.api.libs.ws.ning.NingWSClient(builder.build())
 val newUrl = url.replace("\"", "").replace("|", "%7C").trim
 val response: Future[WSResponse] = client.url(newUrl).get()
 Await.result(response, Duration.create(10, "seconds")).json
}

一切运作良好,但在 128方法调用后,我收到此警告

WARNING: You are creating too many HashedWheelTimer instances.  HashedWheelTimer is a shared resource that must be reused across the application, so that only a few instances are created.

大约20次更多通话即时通讯

23:24:57.425 [main] ERROR com.ning.http.client.AsyncHttpClient - Unable to instantiate       provider com.ning.http.client.providers.netty.NettyAsyncHttpProvider.  Trying other providers.
23:24:57.438 [main] ERROR com.ning.http.client.AsyncHttpClient - org.jboss.netty.channel.ChannelException: Failed to create a selector.

问题

1.我假设连接没有关闭?因此我无法建立新的联系。

2.创建这些HTTP调用的正确和安全的方法是什么

3 个答案:

答案 0 :(得分:2)

有同样的问题。

找到2个有趣的解决方案:

  • 确保您没有关闭它们来创建大量客户
  • 您正在使用的threadPool可能导致此问题。

我的代码片段(评论代码行已解决,我现在正在测试几种配置):

  private[this] def withClient(block: NingWSClient => WSResponse): Try[WSResponse] = {
    val config = new NingAsyncHttpClientConfigBuilder().build()
    val clientConfig = new AsyncHttpClientConfig.Builder(config)
     // .setExecutorService(new ThreadPoolExecutor(5, 15, 30L, TimeUnit.SECONDS, new SynchronousQueue[Runnable]))
      .build()
    val client = new NingWSClient(clientConfig)
    val result = Try(block(client))
    client.close()
    result
  }

答案 1 :(得分:0)

为避免这种情况,您可以使用不同的提供商。 private AsyncHttpProvider httpProvider = new ApacheAsyncHttpProvider(config);

private AsyncHttpClient asyncHttpClient = new AsyncHttpClient(httpProvider,config);

答案 2 :(得分:0)

我遇到了同样的问题。在调用递归方法之前,您应该创建builderclient并将客户端传递给递归方法,以及getJsonValue。这就是getJsonValue应该是这样的:

 def getJsonValue(url: String, client: NingWSClient): JsValue = {
   val builder = new com.ning.http.client.AsyncHttpClientConfig.Builder()
   val client = new play.api.libs.ws.ning.NingWSClient(builder.build())
   val newUrl = url.replace("\"", "").replace("|", "%7C").trim
   val response: Future[WSResponse] = client.url(newUrl).get()
   Await.result(response, Duration.create(10, "seconds")).json
}