1

我目前创建了一个自定义 rake 文件,它执行以下操作:

1.) 检查“新”项目的外部提要

2.)对于提要数组中的每个新项目,它都会用新记录更新我的数据库

3.) 我目前在 WHILE 循环中得到它。while 循环有一个 (@loopcheck) 实例变量,该变量最初设置为 true,并且如果引发任何异常。将其重置为 false(因此循环结束)。

这是一个例子:

   While(@loopcheck) do 
      begin
       ....(code here)...
      rescue
        Exception => e
        @loopcheck = false
      end
      sleep(120)
   End

这是不好的编码吗?有一个更好的方法吗?理想情况下,我只想运行一个后台任务,以便每 2-3 分钟检查一次新提要。我查看了 Starling/Workling,但这似乎有点矫枉过正,而且我不确定通过 CRON 运行脚本/运行程序,因为它每次都会重新加载整个 rails 环境。BackgroundRB 也有点矫枉过正?不?

只是想得到一些想法。

4

3 回答 3

2

将 cron 与睡眠结合起来。如果您遇到异常,它将确保事情不会完全崩溃。加载“完整的 Rails 环境”并没有那么糟糕:最坏的情况是 3-6 秒。所以运行你的睡眠循环5次。并 cron rake 任务每 12 分钟运行一次。说得通?

*/12 * * * * rake your task

## your rake task - valid for 10 mins -- 5 x 2 mins sleep worth.

@loopcheck = true

1.upto(5) do 
    begin
       ....(code here)...
    rescue
      Exception => e
      @loopcheck = false
    end
    break if not @loopcheck
    sleep(120)
end
于 2009-06-13T23:49:52.160 回答
2

看看最近关于“Whenever”的 Railscast

链接在这里,评论讨论替代方案

http://railscasts.com/episodes/164-cron-in-ruby

于 2009-06-14T00:09:24.360 回答
0

假设您在 Unix 机器上,这个最简单的可能可行的方法是从 cron 每两分钟运行一次脚本,没有循环/睡眠。这可以让您避免在脚本失败时监控和重新启动脚本。如果确实失败了,cron 会向您发送一封电子邮件。

正如您所指出的,这种方法的缺点是每两分钟启动一个 Ruby 进程就会受到打击。这很重要吗?只有你能说。我在一个负载很轻的盒子上有几个这样的脚本,忘记了它们甚至在那里。

于 2009-06-14T00:16:02.630 回答