Я использую Akka-hhtp (scala) для асинхронной отправки нескольких пакетных HTTP-запросов к API и задаюсь вопросом, как правильно обрабатывать исключения, когда код ответа отличается от 200 OK.
Ниже приведен псевдокод, демонстрирующий мою точку зрения.
/* Using For comprehension here because the server API has restriction on the amount of data we can send and the time it takes them to process each request. So they require us to send multiple mini requests instead. If one of those fails, then our entire job should fail.*/
val eventuallyResponses = for {
batches <- postBatch(payload)
} yield batches
val eventualResponses = Future.sequence(eventuallyResponses)
/* Do I need to recover here? If I don't, will the actor system terminate? */
eventualResponses.recover { case es =>
log.warn("some message")
List()
}
/* As I said I need to wait for all mini batch requests to complete. If one response is different than 200, then the entire job should fail. */
val result = Await.result(eventualResponses, 10.minutes)
actorSystem.terminate().oncomplete{
case Success(_) =>
if (result.isEmpty) =>
/* This doesn't seem to interrupt the program */
throw new RuntimeException("POST failed")
} else {
log.info("POST Successful")
}
case Failure(ex) =>
log.error("error message $ex")
throw ex
}
def postBatch(payload) = {
val responseFuture: Future[HttpResponse] = httpClient.post(payload)
responseFuture.flatMap{ res =>
res.status match {
case StatusCodes.OK => Future.successful(res)
case _ => Future.failed(new RuntimeException("error message"))
}
}
}
Приведенный выше код вызывает исключение, когда мы получаем коды состояния, отличные от OK. Он проходит через ветку result.isEmpty
true, но, похоже, не останавливает / не прерывает выполнение программы. Мне нужно это сделать, поскольку это запланировано как задание Autosys, и мне нужно, чтобы задание не выполнялось, если хотя бы один из пакетных запросов возвращает ответ, отличный от 200 OK.
Если я не recover
и разрешу генерировать исключение, то (когда мы получим код состояния, отличный от 200), будет ли система актеров завершена должным образом?
Знаете ли вы охороший способ сделать выше?
Спасибо:)