WSClient - 打开文件太多

时间:2016-10-18 20:35:37

标签: scala playframework

我在CentOS 6上使用Play Framework 2.4并且我的应用程序抛出了这个异常:

java.net.SocketException: Too many open files

我已经在Stack Overflow上搜索了很多主题并尝试了解决方案:

  • 将打开的文件数增加到65535;
  • 更改/etc/security/limits.conf;
  • 的硬限制和软限制
  • 在/etc/sysctl.conf上更改fs.file-max的值;
  • 减少文件/ proc / sys / net / ipv4 / tcp_fin_timeout的超时时间;

错误不断发生。在其他网站上,我发现人们面临同样的问题,因为他们没有从WSClient调用close()方法,但在我的情况下,我正在使用依赖注入:

@Singleton
class RabbitService @Inject()(ws:WSClient) {

  def myFunction() {
    ws.url(“url”).withHeaders(
      "Content-type" -> "application/json",
      "Authorization" -> ("Bearer " + authorization))
      .post(message)
      .map(r => {
      r.status match {
        case 201 => Logger.debug("It Rocks")
        case _ => Logger.error(s"It sucks")
      }
    })

  }

}

如果我改变我的实现以等待结果,它的工作就像一个魅力,但性能非常差 - 我想使用map函数而不是等待结果:

@Singleton
class RabbitService @Inject()(ws:WSClient) {

  def myFunction() {
    val response = ws.url("url")
      .withHeaders(
        "Content-type" -> "application/json",
        "Authorization" -> ("Bearer " + authorization))
      .post(message)

    Try(Await.result(response, 1 seconds)) match {
      case Success(r) =>
        if(r.status == 201) {
          Logger.debug(s"It rocks")
        } else {
          Logger.error(s"It sucks")
        }
      case Failure(e) => Logger.error(e.getMessage, e)
    }

  }

}

任何人都知道如何解决此错误?我尝试了一切但没有成功。

1 个答案:

答案 0 :(得分:0)

如果有人遇到同样的问题,你需要在application.conf上配置WSClient - 需要设置macConnectionsTotal和maxConnectionsPerHost。

这就是我解决这个问题的方法。

https://www.playframework.com/documentation/2.5.x/ScalaWS