Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 无限的请求序列在欺骗未来_Scala_Future_Finagle - Fatal编程技术网

Scala 无限的请求序列在欺骗未来

Scala 无限的请求序列在欺骗未来,scala,future,finagle,Scala,Future,Finagle,我有一个HTTP API端点,需要不断检查新值。幸运的是,它支持长轮询。所以我的想法是,我需要实现一个“无限循环”,在这个循环中,我执行一个请求,等待一个响应(最多10分钟),从响应中获得一些值,并通过将它们存储在某个地方产生副作用,然后发出另一个请求 考虑到我有一些函数,调用这些函数将启动这个“无限循环”,我还需要返回一个Closable,以满足我正在集成的欺骗API的要求,这样过程就可以中断。如果HTTP请求失败,我需要立即重试 现在,我需要弄清楚如何在Finagle中使用Futures实现

我有一个HTTP API端点,需要不断检查新值。幸运的是,它支持长轮询。所以我的想法是,我需要实现一个“无限循环”,在这个循环中,我执行一个请求,等待一个响应(最多10分钟),从响应中获得一些值,并通过将它们存储在某个地方产生副作用,然后发出另一个请求

考虑到我有一些函数,调用这些函数将启动这个“无限循环”,我还需要返回一个
Closable
,以满足我正在集成的欺骗API的要求,这样过程就可以中断。如果HTTP请求失败,我需要立即重试

现在,我需要弄清楚如何在Finagle中使用
Future
s实现这一点。我想知道是否可以通过将转换应用于响应Future?来使用递归?。。还是我遗漏了什么,有一个更直接的方法来欺骗我


谢谢

我无法想象它(您描述的内容)如何比递归更直接:

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

请注意,这实际上不是传统意义上的递归,因为我们通常应该期望(有一些保留)在任何给定时间只有一个
keepCalling
实例在堆栈上,因为“递归”调用发生在不同的线程上。

我不确定我能想象它是如何发生的(如您所描述的)可以使其比递归更简单:

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

请注意,这实际上不是传统意义上的递归,因为我们通常应该期望(有一些保留)在任何给定时间只有一个
keepCalling
实例在堆栈上,因为“递归”调用发生在不同的线程上。

我也有类似的问题,但是我已经用http4s/scalaz stream
time.awakevery.map()
解决了这个问题。我也遇到过类似的问题,但是我用http4s/scalaz stream
time.awakevery.map()解决了这个问题。谢谢!那么,这是否意味着内存消耗将随着每个周期而增长?还是Scala会处理?另外,您将如何处理取消的
?A
var
?或者有更好的方法来做到这一点?我没有看到任何关于这个案例的建议,表明您应该比在任何其他应用程序中更担心内存消耗。我的意思是,你确实需要担心它,如果你不适当地释放裁判,它会增长,我只是不明白为什么这个案件会让你比其他任何案件更担心。至于处理
已取消
。。。是的,我猜是一个
var
。在这样一个简单的情况下,不需要任何花哨的东西。只需确保它
易变
,以便一个线程中的更新被另一个线程正确地看到。非常感谢!最后一个问题是,如果
makeRequest
将返回失败的未来,该怎么办?“回路”会刹车吗?我们是否应该使用其他工具而不是
flatMap
来进行“重试”?当然可以。您可以在
.flatMap
之前插入
.rescue
.handle
来处理异常。我最后做了如下操作:(抱歉,我无法将该片段正确地放入注释中)它看起来合理吗?谢谢谢谢那么,这是否意味着内存消耗将随着每个周期而增长?还是Scala会处理?另外,您将如何处理取消的
?A
var
?或者有更好的方法来做到这一点?我没有看到任何关于这个案例的建议,表明您应该比在任何其他应用程序中更担心内存消耗。我的意思是,你确实需要担心它,如果你不适当地释放裁判,它会增长,我只是不明白为什么这个案件会让你比其他任何案件更担心。至于处理
已取消
。。。是的,我猜是一个
var
。在这样一个简单的情况下,不需要任何花哨的东西。只需确保它
易变
,以便一个线程中的更新被另一个线程正确地看到。非常感谢!最后一个问题是,如果
makeRequest
将返回失败的未来,该怎么办?“回路”会刹车吗?我们是否应该使用其他工具而不是
flatMap
来进行“重试”?当然可以。您可以在
.flatMap
之前插入
.rescue
.handle
来处理异常。我最后做了如下操作:(抱歉,我无法将该片段正确地放入注释中)它看起来合理吗?谢谢