Я работаю с 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)
}
}
}
У кого-нибудь есть идея, как я могу исправить эту ошибку? Я пробовал все, но безуспешно.