#scala #akka-http
#scala #akka-http
Вопрос:
Почему выполнение приведенного ниже кода занимает около минуты? Что я делаю не так?
implicit val actors = ActorSystem("request")
val config = ClientConnectionSettings(actors).withConnectingTimeout(5.seconds)
val settings = ConnectionPoolSettings(actors).withConnectionSettings(config).withMaxRetries(0)
def req(attempt: Int = 1) {
implicit val ec: ExecutionContextExecutor = ExecutionContext.global
println(s"[${LocalDateTime.now}] Running ${attempt}:")
Http()(actors)
.singleRequest(settings = settings, request = HttpRequest(uri = Uri("http://x")))
.onComplete {
case Success(v) =>
println(s"[${LocalDateTime.now}] ${v.toString}")
case Failure(x) =>
println(s"[${LocalDateTime.now}] ${x.getCause.toString}")
if (attempt < 10)
req(attempt 1)
}
}
req()
Вывод (обратите внимание на временные метки):
[2020-12-03T16:39:15.044092200] Running 1:
[2020-12-03T16:39:18.655240600] java.net.UnknownHostException: x
[2020-12-03T16:39:18.655240600] Running 2:
[2020-12-03T16:39:18.804865900] java.net.UnknownHostException: x
[2020-12-03T16:39:18.805865400] Running 3:
[2020-12-03T16:39:19.035596500] java.net.UnknownHostException: x
[2020-12-03T16:39:19.035596500] Running 4:
[2020-12-03T16:39:19.525629100] java.net.UnknownHostException: x
[2020-12-03T16:39:19.525629100] Running 5:
[2020-12-03T16:39:20.384635500] java.net.UnknownHostException: x
[2020-12-03T16:39:20.384635500] Running 6:
[2020-12-03T16:39:22.166904400] java.net.UnknownHostException: x
[2020-12-03T16:39:22.166904400] Running 7:
[2020-12-03T16:39:25.399605500] java.net.UnknownHostException: x
[2020-12-03T16:39:25.399605500] Running 8:
[2020-12-03T16:39:34.705446800] java.net.UnknownHostException: x
[2020-12-03T16:39:34.705446800] Running 9:
[2020-12-03T16:39:53.291327600] java.net.UnknownHostException: x
[2020-12-03T16:39:53.291327600] Running 10:
[2020-12-03T16:40:23.490653800] java.net.UnknownHostException: x
Нужно ли мне увеличивать какой-либо предел соединения или принудительно закрывать их или что?
Ответ №1:
Решение, как выясняется, состоит в том, чтобы добавить .withMaxConnectionBackoff(..)
к ConnectionPoolSettings
, потому что это приводит не только к повторным попыткам, но и ко всем запросам, выполняемым в одной цепочке.
Комментарии:
1. Еще 2 дня я не могу. 🙂