私は本番環境でApache + Passengerで実行されているアプリを持っています。現在、イニシャライザで rufus スケジューラを初期化し、そのイニシャライザでデータベースから読み取るジョブを登録しています。apache/passenger が機能する方法は、アプリの複数のプロセス/インスタンスを作成することです。これにより、スケジューラが複数回初期化され、重複したジョブがスケジュールされます。
スケジューラがシングルトンオブジェクトになるようにこれを実装するのは正しいですか?
私は本番環境でApache + Passengerで実行されているアプリを持っています。現在、イニシャライザで rufus スケジューラを初期化し、そのイニシャライザでデータベースから読み取るジョブを登録しています。apache/passenger が機能する方法は、アプリの複数のプロセス/インスタンスを作成することです。これにより、スケジューラが複数回初期化され、重複したジョブがスケジュールされます。
スケジューラがシングルトンオブジェクトになるようにこれを実装するのは正しいですか?
おそらく、Rufus Scheduler をアプリケーション外の別のワーカー プロセスとして実装したいと思うでしょう。
それをイニシャライザとして配置する代わりに、それを開始する Rake タスクを実装します。
# Rakefile
desc "Starts the Scheduler worker"
task :scheduler do
require 'path/to/your/scheduler/file'
scheduler.join
end
次に、実行rake scheduler
してバックグラウンドで開始します。
おまけ: アプリには 2 つのプロセスが必要になるため、Foreman を使用してアプリケーションの複数のプロセスを管理します。これを行うには、次のファイルを作成しますProcfile
。
# Procfile
web: thin start -p 4242
scheduler: rake scheduler
次に、Foreman を使用してアプリを起動します (必ずgem install foreman
最初に実行してください) 。
$ foreman start
これにより、両方のプロセスが同時に呼び出されます。