rails 3中的Rufus调度程序实现

ed1*_*d1t 5 ruby passenger scheduled-tasks rufus-scheduler ruby-on-rails-3

我有一个运行apache +乘客的应用程序正在生产中.目前,我在初始化程序中初始化rufus调度程序,并在该初始化程序中注册从db读取的作业.apache/passenger的工作方式是创建应用程序的多个进程/实例,这会导致调度程序多次初始化并安排重复的作业.

实现这个的正确性是什么,以便调度程序是一个单例对象?

Ric*_*ruz 5

您可能希望将 Rufus Scheduler 实现为应用程序之外的单独工作进程。

我不会将其作为初始化程序,而是实现一个启动它的 Rake 任务。

# Rakefile
desc "Starts the Scheduler worker"
task :scheduler do
  require 'path/to/your/scheduler/file'

  scheduler.join
end
Run Code Online (Sandbox Code Playgroud)

然后只需运行即可rake scheduler在后台启动它。


奖励:由于您的应用程序现在需要并排 2 个进程,因此请使用 Foreman 来管理应用程序的多个进程。您可以通过创建一个名为的文件来做到这一点Procfile

# Procfile
web:       thin start -p 4242
scheduler: rake scheduler
Run Code Online (Sandbox Code Playgroud)

然后使用 Foreman 启动您的应用程序:(请务必gem install foreman首先)

$ foreman start
Run Code Online (Sandbox Code Playgroud)

这将同时调用两个进程。