何时放弃从外部Web服务获取结果?

时间:2013-07-29 18:49:16

标签: ruby-on-rails ruby api http

我正在使用a gem从Ideone.com获取代码结果。 gem将代码提交给Ideone,然后检查结果页面。它检查timeout次,然后放弃,如果没有结果。问题是它可能会过早放弃,但如果没有结果,我也不希望它等待太久。有没有办法知道何时应该放弃希望?

这是相关代码:

   begin
      sleep 3  if i > 0
      res = JSON.load(
        Net::HTTP.post_form(
          URI.parse("http://ideone.com/ideone/Index/view/id/#{loc}/ajax/1"),
          {}
        ).body
      )
      i += 1
    end while res['status'] != '0' && i < timeout

    if i == timeout
      raise IdeoneError, "Timed out while waiting for code result."
    end

1 个答案:

答案 0 :(得分:1)

听起来你想调整睡眠超时和尝试次数参数。没有适用于每种情况的绝对值,因此您应该选择一些最适合您的应用。

不幸的是,宝石代码具有硬编码的这些参数(3秒延迟和4次尝试),因此您没有一种优雅的方式来更改它们。因此,您可以分叉gem并更改其代码,或者尝试使用http://apidock.com/ruby/Module/const_set对TIMEOUT常量值进行修补。但是,如果没有重写方法.run的宝石,你将无法修补尝试之间的延迟值。

FYI。 Net :: HTTP有自己的超时 - 等待ideone.com连接和响应的时间。如果超出它们,Net :: HTTP会引发超时异常。安装者是

http://ruby-doc.org/stdlib-2.0/libdoc/net/http/rdoc/Net/HTTP.html#method-i-read_timeout-3D和#open_timeout =。