1

私は現在、次のことを行うカスタムrakeファイルを作成しました。

1.)「新しい」アイテムの外部フィードをチェックします

2.)フィード配列内の新しいアイテムごとに、データベースが新しいレコードで更新されます

3.)私は現在WHILEループでそれを持っています。whileループには、最初にtrueに設定され、例外が発生した場合にtrueに設定される(@loopcheck)インスタンス変数があります。falseにリセットします(ループが終了します)。

次に例を示します。

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

これは悪いコーディングですか?これを行うためのより良い方法はありますか?理想的には、バックグラウンドタスクを実行して、2〜3分ごとに新しいフィードを確認するだけです。Starling / Worklingを調べましたが、それは少しやり過ぎのようで、毎回Rails環境全体をリロードするため、CRONを介してスクリプト/ランナーを実行するかどうかはわかりませんでした。BackgroundRBも少しやり過ぎですか?いいえ?

いくつかのアイデアを得たかっただけです。

4

3 に答える 3

2

cron とスリープを組み合わせます。例外が発生した場合に、物事が完全に崩壊しないようにします。「完全な Rails 環境」のロードは、それほど悪くはありません。最悪の場合、3 ~ 6 秒です。睡眠ループを5回実行します。rake タスクを cron して、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から2分ごとにスクリプトを実行することです。これにより、失敗した場合にスクリプトを監視して再起動する必要がなくなります。失敗した場合は、cron からメールが送信されます。

お気づきのように、このアプローチの欠点は、Ruby プロセスの起動に 2 分ごとに時間がかかることです。それは重要ですか?あなただけが言うことができます。負荷の軽いボックスにこのようなスクリプトがいくつかありますが、それらがそこにあることさえ忘れています。

于 2009-06-14T00:16:02.630 に答える