13

Rails で JRuby 1.5.6 を使用して、定期的に停止し、購読している RSS ポッドキャストを取得するアプリケーションを自分で構築しています。

私が JRuby を選んだ主な理由は、私が Java に精通していること、Rails フレームワークを利用したいこと、そして最も重要なこととして、Ruby が要件を満たしていない場合に Java で「重労働」タスクを実行できることです。現在まで (私はまだ開発の初期段階にあります)、このハイブリッド アプローチは非常にうまく機能しています。

私は今、定期的で長時間実行されるタスクのスケジューリングをバックグラウンド プロセスに実装する必要があるところまで来ました。私の要件は、理想的には、十分に文書化され、現在維持されていてクリーンな、データベースに支えられたスケジューリング システムを持つことです。

私の問題は、何日もかけて適切な自己 gem パッケージ化されたソリューションを調査した後、JRuby を使用しているため、選択肢がほとんど残っていないように見えることです。

私が試した宝石のいくつか...

ルーファス スケジューラ

インターフェイスとドキュメントに満足する前にこれを使用したことがありますが、データベースの永続性が不足しているため、私の要件の取引ブレーカーです。

遅延ジョブ

私の理想的な解決策はdelayed_jobです。優れたドキュメントは引き続き維持され、データベースがサポートされていますが、JRuby では ObjectSpace がオフになっているために機能しなくなります (ただし、再度有効にすることでこれを修正できます)。 JRuby 実装内の制限により、JRuby ではデフォルトで」エラーが発生します。

デーモンに依存しない github のフォークがありますが、メインの開発ブランチからフォークに切り替えることに満足しておらず、ObjectSpace の問題がまだ残っており、そのパフォーマンスについて確信が持てません。影響。

クォーツ-jruby

これまでにもさまざまなクォーツベースの宝石がありましたが、このごく最近の製品は、洗練されたルビーのようなインターフェイスを提供する別の試みです。ただし、ドキュメントは最小限であり、これがデータベースに裏付けられているかどうかはわかりませんが、そうではないというのが私の直感です。

問題

ここでは 3 つのオプションのみを取り上げましたが、他にも利用可能なオプションがあることは承知しています。ただし、3 つの要件ボックスすべて (ドキュメント、保守、データベース バックアップ) にチェックを入れるための解決策を見つけることができませんでした。

質問は...

他の誰かがこの状況に陥り、解決策を思いついたことがありますか?

誰かがdelayed_jobを何らかの形で機能させたことがありますか?

私が見落としていて、私のニーズを満たすより良い解決策はありますか?

4

4 に答える 4

4

キューイングシステムとしてresqueをお勧めします。ResqueはDelayedJobに似ていますが、私の意見でははるかに優れています。GitHubで開発され、キューイングシステムとして使用されています。私も1年近く本番環境で使用していて、とても満足しています。

Resqueは間違いなくJRubyをサポートしており、スケジュールされたジョブを取得するために必要なのは、単純なスケジューラーだけです。resque-schedulerを推奨する人もいますが、私はそれをシンプルに保ち、スケジューラーをキューに入れるための単純なcronのようなタスクを作成するための優れたDSLを備えたclockworkを使用するのが好きです( clockwork READMEを参照)。これで、次のようなスケジュールを立てることができます。

every(1.hour, 'tasks.alert') { Resque.push(:cron, :class => 'TaskAlert', :args => []) }
于 2011-02-12T16:52:04.517 に答える
4

JRubyの下でdelayed_job (collectiveidea/v1.8.4)を本番環境で1年以上使用しています。ObjectSpace を有効にしておらず、daemons gem も使用していません。

簡単なレーキ タスクを作成しました

  namespace :product do
    desc "Start Delayed Job Worker"
    task :dw => :environment do
      Delayed::Worker.new.start
    end
  end

OSに依存する方法でデーモン化します。Linux では、

nohup jruby -S rake product:dw > $log_dir/delayed_job_console.log  2>&1 &
于 2011-02-10T01:31:41.250 に答える
2

https://github.com/kares/jruby-rack-workerを確認してください。 これにより、jruby 環境でdelayed_job ソリューションが可能になります。まだ作業中です。執筆時点での私の経験では、単一のワーカーで問題なく動作します。追加のワーカーを実行するのは難しいですが。

于 2011-04-18T21:02:00.383 に答える
1

私はもともとこの質問を 2010 年 12 月に行い、それ以来、他の人が参照できるように投稿する価値があると思われる解決策を開発しました。

他の人が指摘しているように、delayed_job のようなライブラリを JRuby で動作させることは可能であり、これが受け入れられる解決策である場合もあります。ただし、追加のプロセスを実行する必要があるソリューションは望んでいませんでした。それを念頭に置いて、Java の Executor フレームワークを利用し、それを ActiveRecord と統合する gem を開発しました。

その結果としてact_as_executorが作成され、Rails 3.x アプリケーションは、他の ActiveRecord モデルと同様に、executor およびタスク (適切な Java スレッドで実行されます) とやり取りできるようになります。

最近、gem をリリース候補 1 に移動しました。GitHubRubygemsを見てください。

NB RubyGems のデフォルト ページには、何らかの理由でまだ beta2 が表示されます。ただし、rc1 はまだ最新のリリースです。

于 2011-09-09T11:11:41.370 に答える