Akka HTTP: как сделать так, чтобы поток Http (). SuperPool () не генерировал исключения при обнаружении неправильного URL-адреса? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть много URL-адресов, которые я хотел бы получить с помощью Akka HTTP и потоков.

Возможно, URL-адреса сформированы неправильно или DNS не может разрешить имя хоста. В этих случаях я бы хотел, чтобы поток superPool () просто возвращал Failure как Try [HTTPResponse] вместо того, чтобы генерировать исключение и завершать весь поток.

Как мне go это сделать ? Я искал это, но ничего не придумал, не могу найти способ обрабатывать esceptions в самих документах.

EDIT: немного поигравшись, я обнаружил, что единственная проблема - с URL-адресами HTTPS, и даже тогда поток не закрывается, но я получаю сообщение об ошибке на консоли, чего не должно происходить. Вот небольшой пример для воспроизведения:

import akka.stream.scaladsl.{Sink, Source}    
import akka.NotUsed
import scala.util.Success
import akka.http.scaladsl.model.HttpRequest
import akka.http.scaladsl.Http
import akka.actor.ActorSystem

implicit val system = ActorSystem()
Source.single((HttpRequest(uri = "https://a.com"), NotUsed))
          .via(Http().superPool[NotUsed]())
          .map(_ match {
              case (Success(v), _) => {v.discardEntityBytes(); println("Success")}
              case _ => println("Failure")
          })
          .runWith(Sink.ignore)

Может быть, Http().superPool ожидает URL-адреса HTTP, и есть другой способ работы с HTTPS?

РЕДАКТИРОВАТЬ 2: Я открыл проблему с проектом: https://github.com/akka/akka-http/issues/3138

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Поскольку superPool уже должен возвращать Try, я считаю это ошибкой и сообщаю о проблеме. По крайней мере, я не нашел документации, в которой говорится, что недопустимый запрос должен вместо этого прерывать поток или возвращать Failure.

В качестве обходного пути я бы попытался использовать стратегию надзора:

val decider: Supervision.Decider = {
  case _: Malformed URL Exception => Supervision.Resume // put your exception type here
  case _                          => Supervision.Stop
}

Http().superPool()
  .withAttributes(ActorAttributes.supervisionStrategy(decider))
0 голосов
/ 12 мая 2020

Это проблема с akka-http 10.1.11, исправленная в версии 10.1.12. В последней версии по умолчанию не регистрируются ошибки с URL-адресами HTTP и HTTPS.

...