WSClient — слишком много открытых файлов

Я работаю с Play Framework 2.4 на CentOS 6, и мое приложение выдает это исключение:

java.net.SocketException: Too many open files

Я искал много тем в Stack Overflow и пробовал решения:

  • Увеличить количество открытых файлов до 65535;
  • Изменить жесткие и мягкие ограничения в файле /etc/security/limits.conf;
  • Измените значение fs.file-max в /etc/sysctl.conf;
  • Уменьшено время ожидания файла /proc/sys/net/ipv4/tcp_fin_timeout;

Ошибка продолжает происходить. На других сайтах я нашел людей, которые сталкиваются с той же проблемой, потому что они не вызывали метод close() из WSClient, но в моем случае я работаю с внедрением зависимостей:

@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")
      }
    })

  }

}

Если я изменю свою реализацию, чтобы дождаться результата, она работает как шарм, но производительность очень низкая, и вместо этого я хотел бы использовать функцию карты, ожидая результата:

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

  }

}

У кого-нибудь есть идея, как я могу исправить эту ошибку? Я пробовал все, но безуспешно.


person Community    schedule 18.10.2016    source источник


Ответы (1)


Если кто-то сталкивается с такой же проблемой, вам нужно настроить WSClient на application.conf - нужно установить maxConnectionsTotal и maxConnectionsPerHost.

Вот как я решил эту проблему.

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

person Community    schedule 10.08.2017