2016-06-23 3 views
0

У меня есть конечная точка HTTP API, в которой мне нужно постоянно проверять новые значения. К счастью, он поддерживает длительный опрос. Поэтому идея состоит в том, что мне нужно реализовать «бесконечный цикл», где я делаю запрос, дождаться ответа (не более 10 минут), получить некоторое значение от ответа и создать побочный эффект, сохранив их где-нибудь, сделать другой запрос.Бесконечная последовательность запросов в Finagle with Future

Учитывая, что у меня есть функция, для которой будет запущен этот «бесконечный цикл», мне также нужно вернуть Closable, чтобы удовлетворить API Finagle. Я интегрирую, поэтому процесс можно прервать. Если запрос HTTP не удается, я должен повторить попытку немедленно.

Теперь мне нужно выяснить, как реализовать это с помощью Future s в Финале. Интересно, могу ли я использовать рекурсию, применяя преобразование к ответу «Будущее»? .. Или я что-то упускаю, и есть более простой способ сделать это в Финагле?

Спасибо!

+0

У меня была аналогичная проблема, но я решил ее с помощью http4s/scalaz-stream 'time.awakeEvery.map ()'. – Reactormonk

ответ

2

Я не уверен, что я могу себе представить, как это (то, что вы описали) может быть любой более простым, чем рекурсивный:

def keepCalling: Future[Unit] = makeRequest 
    .flatMap { response => 
     processResponse(response) 
     if(cancelled) Future.Unit else keepCalling 
    } 

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

+0

Спасибо! Значит ли это, что потребление памяти будет расти с каждым циклом? Или Скала позаботится об этом? Кроме того, как бы вы справились с «отмененными»? «Var»? Или есть лучший способ сделать это? – Ashald

+0

Я ничего не вижу в этом случае, который предполагает, что вы должны беспокоиться о потреблении памяти больше, чем в любом другом приложении. Я имею в виду, вам нужно беспокоиться об этом, и он будет расти, если вы не будете правильно выпускать ссылки, я просто не понимаю, почему этот случай должен вас больше беспокоить, чем любой другой. Что касается обработки 'canceled' ... да,' var', я думаю. Нет необходимости в чем-нибудь интересном в таком простом случае. Просто убедитесь, что он «volatile», так что обновления, сделанные в одном потоке, хорошо видны другим. – Dima

+0

Супер спасибо! И последний вопрос, что, если 'makeRequest' вернет неудачное будущее? «Цикл» будет тормозить? Должны ли мы использовать что-то другое, а не «flatMap», чтобы «повторить»? – Ashald

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