2016-05-18 4 views
2

Я пытаюсь найти лучший способ получить содержимое из запроса GET http с использованием тайм-аута. Я потратил много времени, пытаясь найти лучший подход, но я немного не уверен.Получение ответа HTTP с использованием спрея и фьючерсов с таймаутом

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

Благодаря

+0

вы используете клиент спрей HTTP? –

+0

Да, я использую Spray – tigga4392

ответ

0

Вы можете попробовать что-то вроде этого:

timedOutFuture = after(duration = duration, using = system.scheduler) { 
    Future.successfull(None) 
} 

Future.firstCompletedOf(Seq(youHttpRequestFuture, timedOutFuture)) 

Надеется, что это помогает

1

Так что я полагаю, вы пытаетесь решить 2 проблемы. Как определить определенный тайм-аут в конфигурации, а затем как управлять таймаутами, когда они происходят.

  • Определение HTTP-клиент таймаут: Вам нужно будет обновить application.conf перезаписать default configuration of the http client. например .:

    spray.can { 
        client { 
        request-timeout = 20s 
        } 
    } 
    
  • Управление таймаут: При использовании spray client, вы будете использовать pipeline, который будет запускать запросы. Это будет функция, которая выглядит примерно как (HttpRequest) => Future[ObjectResponse]. Результатом будет Future объекта, который вы определили, ObjectResponse в моем примере, вы можете решить будущее. В случае отсутствия таймаута Future станет RequestTimeoutException. Затем вы сможете обработать исключение тайм-аута с помощью recover. Так что ваш код будет выглядеть примерно так:

    def sendRequestFunction(...): Future[ObjectResponse] = {...} 
    
    sendRequestFunction(parameters) map (Option) // In case we get an object, we will have a Some(obj) 
    recover { 
        case e: RequestTimeoutException => None 
    } 
    

 Смежные вопросы

  • Нет связанных вопросов^_^