从Rails应用程序中监视数据库表以获取外部更改

时间:2010-04-01 12:23:11

标签: ruby-on-rails activerecord cron delayed-job observers

我正在我的Rails应用程序中集成一些非rails模型表。一切都很顺利,我设置模型的方式是:

class Change < ActiveRecord::Base
  establish_connection(ActiveRecord::Base.configurations["otherdb_#{RAILS_ENV}"])
  set_table_name  "change"
end

通过这种方式,我可以将Change模型用于find等所有现有记录。

现在,当记录添加到表格中时,我想要运行某种通知。由于模型永远不会通过Change.newChange.save创建,因此使用ActiveRecord::Observer不是一种选择。

每当添加新记录时,有什么方法可以让我的Rails代码被执行?我看着delayed_job但是我不能完全理解,如何设置它。我想它围绕一个cron-job进行演变,它选择自上次作业运行以来创建的所有行,然后为每一行调用相应的Rails代码。

更新目前正在查看Javan的Whenever,看起来它可以解决'来自cron part的'运行轨道代码'。

3 个答案:

答案 0 :(得分:1)

是的,你要么想要某种后台任务处理器(延迟:: Job是流行的那个,或者你可以用守护进程库或类似的东西伪装自己)或者设置一些运行在某些上的cronjob时间表。如果你想经常检查(每分钟,比方说),我建议使用Delayed :: Job路线,如果它更长(每小时左右),一个cron工作就可以了。

走DJ路线,您需要创建一个检查新记录的作业,如果有的话,处理它们,然后重新排队,因为每个作业在完成后都标记为“已完成”。

-Jon

答案 1 :(得分:1)

这就是我最终做的:使用Whenever,因为它与Capistrano很好地集成,并向我展示了如何从cron中运行Rails代码。我失去的和平基本上是

script/runner -e production 'ChangeObserver.recentchanges'

现在每5分钟运行一次。 recentchanges从tmp文件中读取最后一个查找的ID,提取ID高于该值的所有新Change记录,并为每条记录运行正常的观察者代码(并保存最高的查找-at ID到tmp文件,当然)。

答案 2 :(得分:1)

与监控状态更改一样,有两种方法:轮询和通知。您似乎现在选择了轮询方式(有一个cron作业定期查看数据库的状态并执行一些代码,如果更改) 您可以使用其中一个rails调度程序执行相同的操作,其中有一些(google会很容易找到它们,它们有各种功能集,如果你这样,我会让你选择一个适合你需要的功能集)

您还可以尝试根据您的数据库进行通知。某些数据库支持触发器和外部进程执行或特定通知协议。 在这种情况下,数据库本身会通知您表已更改。 Getting events from a database

中的各种DBMS有很多这样的选项