Я изучаю библиотеку Akka, я установил локальный сервер в своей системе, используя платформу Play, и я пишу клиентское приложение, используя библиотеку Akka.
implicit val system = ActorSystem("testing")
implicit val materializer = ActorMaterializer()
import system.dispatcher
val serverHttpRequests = files.map { file =>
(
HttpRequest (
HttpMethods.POST,
uri = Uri(Url),
entity = HttpEntity(
ContentTypes.`text/plain(UTF-8)`,
getChartData(file) // reading file from local file system
)
), file.getName
)
}
val res = Source(serverHttpRequests)
.via(Http().cachedHostConnectionPool[String]("localhost", 9001))
.runForeach {
case (Success(response), fileName) => logger.info(s"$fileName, $response")
response.discardEntityBytes()
case (Failure(ex), fileName) => logger.info(s"$fileName failed with $ex")
}
есть несколько файлов, которые требуется более 1 минуты, чтобы получить ответ от локального сервера, и я получаю следующее исключение для этих файлов fileName failed with akka.stream.StreamTcpException: The connection closed with error: An existing connection was forcibly closed by the remote host
Я попытался увеличить время ожидания до 300 секунд как для клиента, так и для сервера. client application.conf
akka.http.client.idle-timeout = 300s
akka.http.client.connecting-timeout = 300s
server application.conf
akka.http.host-connection-pool.idle-timeout = 300s
akka.http.host-connection-pool.client.idle-timeout = 300s
play.server.akka.https.idleTimeout = 300s
play.server.akka.requestTimeout = 300s
play.server.akka.terminationTimeout = 300s
akka.http.server.bind-timeout = 300s
для приведенного выше кода я пытаюсь обработать 10 файлов, каждый размером меньше 20 KB
, и ответ сервера будет в среднем меньше 120 KB
для каждого файла. Я также читал, что Akka IO.selectors
будет поддерживать соединения, посылая сердцебиение, Я пытаюсь понять точную причину этого исключения и обработать его.