带有 Future 的 Finagle 中的无限请求序列
Infinite Sequence of requests in Finagle with Future
我有一个 HTTP API 端点,我需要不断检查新值。幸运的是,它支持长轮询。所以我的想法是我需要在我发出请求的地方实现 'an infinite loop' ,等待响应(最多 10 分钟),从响应中获取一些值并通过将它们存储在某个地方产生副作用,发出另一个请求。
鉴于我有一些函数调用将启动此 'infinite loop' 我还需要 return 一个 Closable
来满足 Finagle API 我正在集成这样这个过程就可以被打断。如果 HTTP 请求失败,我需要立即重试。
现在我需要弄清楚如何在 Finagle 中使用 Future
s 实现它。我想知道我是否可以通过将转换应用于响应 Future 来使用递归?..或者我是否遗漏了一些东西并且在 Finagle 中有更直接的方法来做到这一点?
谢谢!
我不确定我能否想象它(你所描述的)可以比递归更直接:
def keepCalling: Future[Unit] = makeRequest
.flatMap { response =>
processResponse(response)
if(cancelled) Future.Unit else keepCalling
}
请注意,这实际上 不是 传统意义上的递归,因为我们通常应该期望(有一些保留)只有一个 keepCalling
实例在在任何给定时间堆栈,因为 "recursive" 调用发生在不同的线程上。
我有一个 HTTP API 端点,我需要不断检查新值。幸运的是,它支持长轮询。所以我的想法是我需要在我发出请求的地方实现 'an infinite loop' ,等待响应(最多 10 分钟),从响应中获取一些值并通过将它们存储在某个地方产生副作用,发出另一个请求。
鉴于我有一些函数调用将启动此 'infinite loop' 我还需要 return 一个 Closable
来满足 Finagle API 我正在集成这样这个过程就可以被打断。如果 HTTP 请求失败,我需要立即重试。
现在我需要弄清楚如何在 Finagle 中使用 Future
s 实现它。我想知道我是否可以通过将转换应用于响应 Future 来使用递归?..或者我是否遗漏了一些东西并且在 Finagle 中有更直接的方法来做到这一点?
谢谢!
我不确定我能否想象它(你所描述的)可以比递归更直接:
def keepCalling: Future[Unit] = makeRequest
.flatMap { response =>
processResponse(response)
if(cancelled) Future.Unit else keepCalling
}
请注意,这实际上 不是 传统意义上的递归,因为我们通常应该期望(有一些保留)只有一个 keepCalling
实例在在任何给定时间堆栈,因为 "recursive" 调用发生在不同的线程上。