3

私は一日を通していつでもrake タスクを呼び出しますが、各タスクは新しい Rails 環境を起動します。ジョブごとに Rails を再起動せずに、1 日を通してタスクを実行するにはどうすればよいですか?

これが私が思いついたものです。これについてフィードバックをいただけませんか?

  1. 各レーキ タスクをリファクタリングして、代わりに適切なモデル内のメソッドにします。

  2. delayed_job gem を使用して低い優先度を割り当て、これらのメソッドが非同期で実行されるようにします。

  3. rake タスクを呼び出す代わりに、各Model.methodを呼び出すように指示する

この解決策は理にかなっていますか? ジョブごとに新しい Rails 環境を立ち上げるのを避けるのに役立ちますか? ..またはこれを行うためのより良い方法はありますか?

--

ランニングレール3

4

3 に答える 3

4

cron を介してdelayed_jobsをキューに入れ、長時間実行されているdelayed_jobワーカーを1つ持つことを検討できます。

次にwhenever、delayed_job エンキュー メソッドの作成に使用できます。wheneverRailsスタック全体ではなく、active_recordとdelayed_jobを直接ロードする小さなラッパースクリプトをcron出力で呼び出すのがおそらく最も簡単です。http://snippets.aktagon.com/snippets/257-How-to-use-ActiveRecord-without-Rails

また、cron を使用している (delayed_jobs をキューに入れる) のと同じことを行う長時間実行プロセスである clockwork.rb を調べることもできます: http://rubydoc.info/gems/clockwork/0.2.3 /フレーム

また、delayed_jobs で再キューイング戦略を試してみることもできます: https://gist.github.com/704047

于 2011-06-04T00:10:08.377 に答える
0

schedule.rb からこの行にコメントしてください

require File.expand_path(File.dirname(__FILE__) + "/environment")

代わりに、モデルのような必要な Ruby ファイルのみをロードします。

于 2016-12-21T12:58:06.057 に答える
0

この問題に対する多くの優れた解決策があり、最終的に統合したのは次のとおりです。

  1. レーキ コードを適切なモデルに移動しました
  2. ブラウザーからモデル メソッドを呼び出すためのコントローラー/ルーティング コードを追加
  3. whenevergem を使用して実行する設定済みの cronjobscommand 'curl mywebsite.com/model#method'

delayed_job を試してみましたが、別の Rails インスタンスを実行するという考えは気に入りませんでした。私の方法はサーバー集約的ではなく、上記のソリューションにより、すでに実行中の Rails 環境を利用できます。

于 2011-06-09T22:13:24.160 に答える