Ждите хвостовой рекурсии для будущего, чтобы закончить - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу отправить 1000 записей одновременно в пакете c из 500. Как только они будут отправлены, я хочу, чтобы хвостовая рекурсия продолжалась. numberOfEventsPerSecond = 1000 putRecordLimit = 500 sendInBatches вызывается до завершения вызова furure. Есть ли способ, которым сначала будет завершен вызов futureCall, затем вызывается только sendInBatches.



  @scala.annotation.tailrec
  final def sendBatches(
    buffer: Seq[File],
    numberOfEventsPerSecond: Int
  ): Seq[PutRecordsRequestEntry] =
{
      val (listToSend, remaining) = buffer.splitAt(numberOfEventsPerSecond)
      val listRes = listToSend
        .grouped(putRecordLimit)
        .toList
        .filter(_.nonEmpty)

      listRes.map { list =>
        futureCall(list.filter(_ != null)) map { putDataResult =>
             println("Sent")
          )
        }
      }
      sendInBatches(fileOption, remaining, numberOfEventsPerSecond)
}

1 Ответ

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

Я думаю, что вы хотите, чтобы использовать будущее синхронно. Вы можете сделать это с Await.result (будущее, продолжительность):

val future = futureCall(list.filter(_ != null))
val futureResult = Await.result(future, Duration.Inf)
sendInBatches(fileOption, remaining, numberOfEventsPerSecond)

Await.result следует использовать очень осторожно, только когда это абсолютно необходимо.

Дополнительная информация о фьючерсах: https://docs.scala-lang.org/overviews/core/futures.html

Дополнительная информация о том, почему вам следует избегать Await.result Насколько рискованно вызывать Await.result при вызовах БД

...