2011-01-05 21 views
4

最後にDelayed_jobが私のために働いています(RoR3のcollectiveidea gemを使って)。 1つは、管理者が画像のzipファイルをギャラリーにアップロードし、各画像を抽出してそのギャラリーに属する写真オブジェクトを構築することです。 2番目はギャラリーを削除することです。これらのギャラリーは非常に大きく(約3〜5分で550枚)、ギャラリーがまだ処理中であるか、完全に表示されなくても削除待ちの状態であることを示すことができます。Rails 3 + delayed_job:タスクの進行状況を追跡するにはどうすればいいですか?(ランディングページの進行状況バーなど)

今、デフォルトの手法(@ gallery.delay.extract_photosと@ gallery.delay.destroy)を使用しています。

管理者が抽出リンクをクリックすると、ギャラリーページ(空の場合)にギャラリーが処理中であることを知らせるフラッシュメッセージが表示されます。ページを更新すると、その時点までに抽出された画像のリストが定期的に表示されます。しかし、一度リフレッシュするとフラッシュメッセージがクリアされるため、ジョブが終了したときは必ずしも明確ではありません。基本的には、毎秒更新するプログレスバーを表示するか、数量の進捗状況を([====== ] 33/86)の横に表示したり、ギャラリーを更新して画像が追加されたときに表示したりすることができます。

大きなギャラリーを削除するには時間がかかることもありますので、遅延したジョブとしても保存しておきたいと思います。ただし、ギャラリーを削除した後にリンク先ページに移動するとギャラリーが存在するため、完全に消えた後は更新後に表示されます。私はそれを削除のためにキューに入れたままにする方法を持っているか、進行状況バーを表示して、削除が終了したら消えるようにしたいと思います。

私はRoR3 AJAXのヘルプを見回しましたが、私が見つけたように見えるものは2.3.8でしたが、廃止予定です。さらに、私はジョブがまだ実行されているかどうかを追跡する方法を知る必要があり、collectiveideaのドキュメントではそれに気づいていません。私は仕事がテーブルに保存されているので、DelayedJob.thisjob.existsを使ってそれを追跡することができたと思いましたか?それらの行に沿った何か、しかし、レールコンソールでDelayedJob.allを試してみると、(仕事が走っている間でも)エラーが出てしまった。

私の質問では、要約すると、遅延したジョブを追跡して、どのように進捗状況を表示することができますか? 私はギャラリーページでアクティブなポーリングを行うことができますが、ジョブが実行されている(またはスケジュールされている)間は常にそのようなことが起こりたくないと思います。実行中または実行予定のジョブの存在をテストする方法はありますか?私はビューでそれを追跡する方法を見つけていないので。

ありがとうございました。

答えて

1

Nginxとそのアップロードモジュールを使用するオプションがありますか?そうすれば、あなたのアプリ全体のパフォーマンスが向上するはずです。彼は比較的大きなアップロードにNginxは、Railsと遅延ジョブを使用していますゴータムレゲことによって、このブログの記事をチェックしてください:

http://blog.joshsoftware.com/2010/10/20/uploading-multiple-files-with-nginx-upload-module-and-upload-progress-bar/

ポストは、彼がレール3を使っている場合は言及していないが、nginxのため、アップロードを処理していますそこにはたくさんのRailsコードはなく、必要に応じて調整することができます。

+0

私はDreamhostを使用していますが、PSアカウントを持っている場合はNginxはオプション機能ですが、残念ながら現時点ではコミットできません。私はこれが私が探している解決策であるかどうかはわかりませんが、プロジェクトの将来の段階で検討していることは間違いありません。 –

3

パーシャルレスポンス...

を行うかそれは を行うことが予定されているというの仕事の 存在をテストする方法はあり

あなたは

Delayed::Job 

がキューとその状態でActive Recordのジョブを取得するために使用することができます。

Delayed::Job.find :all , :conditions=>"locked_at IS NOT NULL" 

プロセスに対してきめ細かな制御を行うには、resqueを使用することをお勧めします。

関連する問題