В маршрутизации akka-http я могу вернуть Future
в качестве ответа, который неявно преобразуется в ToResponseMarshaller
.Как отрегулировать время отклика?
Есть ли способ справиться с таймаутом этого будущего? Или таймаут соединения на уровне маршрута? Или один способ использовать функцию Await()
?
Прямо сейчас клиент может ждать ответа навсегда.
complete {
val future = for {
response <- someIOFunc()
entity <- someOtherFunc()
} yield entity
future.onComplete({
case Success(result) =>
HttpResponse(entity = HttpEntity(MediaTypes.`text/xml`, result))
case Failure(result) =>
HttpResponse(entity = utils.getFault("fault"))
})
future
}
Пожалуйста, объясните, где требуется тайм-аут в вашем коде? Ваш код кажется неправильным: вы создаете HttpResponse в onSuccess и не устанавливаете его везде и не возвращаете. Если вы хотите преобразовать результат в будущую модель метода использования –
Мне нужно отправить ответ с сообщением о неисправности, если someIOFunc() выполняется в течение длительного времени (например, 1 минута). Возможно, шаблон с «onSuccess» неверен, но этот код возвращает правильный ответ, когда успех. Это меня смущает, но я не могу понять, как работает преобразование из будущего в ответ. В источниках есть глубокие слои абстракции, и я не могу понять эту часть. – diemust
Просто удалите 'future' в конце блока. Фьючерсы, как и другие конструкции Scala, являются неизменяемыми структурами данных, которые вызывают методы на них, возвращают еще один фьючерс. Когда вы вызываете метод onComplete, он возвращает новое будущее с помощью 'HttpResponse'. –