Как сделать 10 запросов HTTP одновременно? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть 10 запросов

  val reqTemplate = quickRequest.post(uri"http://localhost:8280/delay/1")
  val requests = for {i <- 1 to 10} yield {
    reqTemplate.body(s"{test:$i}")
  }

Как я могу отправить их одновременно?

Я пытался


  val responseTasks = reqs.map(SttpClient.send)
  val allResponsesTask: Task[List[Response[String]]] = ZIO.collectAllPar(responseTasks)

  val appLogic: Task[Unit] = for {
    resps <- allResponsesTask
    resp <- resps
    _ <- putStrLn(resp.toString())
    _ <- putStrLn("Done")
  } yield ()

  Runtime.default.unsafeRunAsync(appLogic)

Но это дает мне все виды забавной компиляции ошибки.

Error:(18, 74) type mismatch;
 found   : scala.collection.immutable.IndexedSeq[zio.ZIO[sttp.client.asynchttpclient.zio.SttpClient,Throwable,sttp.client.Response[String]]]
    (which expands to)  scala.collection.immutable.IndexedSeq[zio.ZIO[zio.Has[sttp.client.SttpBackend[zio.Task,Nothing,sttp.client.asynchttpclient.WebSocketHandler]],Throwable,sttp.client.Response[String]]]
 required: Iterable[zio.ZIO[Any,Throwable,sttp.client.Response[String]]]
  val allResponsesTask: Task[List[Response[String]]] = ZIO.collectAllPar(responseTasks)
Error:(23, 7) type mismatch;
 found   : zio.ZIO[zio.console.Console,Nothing,Unit]
    (which expands to)  zio.ZIO[zio.Has[zio.console.Console.Service],Nothing,Unit]
 required: scala.collection.GenTraversableOnce[?]
    _ <- putStrLn(response.toString())
Error:(22, 14) type mismatch;
 found   : List[Nothing]
 required: zio.ZIO[Any,Throwable,Unit]
    response <- responses

1 Ответ

0 голосов
/ 05 апреля 2020

Проблема в том, что вы объявили зависимость Sttp, но не предоставили ее.

Если вы аннотируете responsesTask, вы увидите, что он на самом деле имеет тип Seq[ZIO[SttpClient, Throwable, Response[String]]], что означает что вам нужно предоставить клиента для удовлетворения зависимости.

Я бы изменил его на что-то вроде:

  val allResponsesTask: Task[List[Response[String]]] = 
    ZIO.collectAllPar(responseTasks)
      .provideLayer(AsyncHttpClientZioBackend.layer())

Обратите внимание, что я добавил слой здесь для простоты, но в целом Вы хотите добавить все слои на краю своего приложения, поскольку создание слоя не является бесплатным.

...