2016-07-05 5 views
0

コントローラでは、ActiveJobを起動した認証済みのユーザーによる投稿要求があります。ActiveJobsを使用したDelayed_Jobでのキューイング

RunReportsJob.perform_later(param1, param2, param3) 

エラーなく動作します。しかし、すでに実行中のRunReportsJobをトリガするためにユーザがボタン(発砲ポスト要求)を再度押すと、2つのジョブが同時に発生します。私はそれがキューイングサービスだと思って、一度にすべてのことを1つの仕事にとどめていたので、delayed_jobをセットアップしました。しかし、これは起こっていない。以下は私の設定です:

# app/jobs/run_reports_job.rb:

class RunReportsJob < ActiveJob::Base 
     queue_as :RunReports 
     include ShopifyApp::Controller 
     # -------------------------------------------------------------- 
     # JOB ERROR MANAGEMENT 
     # -------------------------------------------------------------- 
     rescue_from(ActiveRecord::RecordNotFound) do |exception| 
      # Do something with the exception 
      logger.debug "Hit rescue_from" 
     end 
     # -------------------------------------------------------------- 
     # JOB FUNCTION 
     # -------------------------------------------------------------- 
     def perform(param1, param2, param3) 
     # some code is performed here 
     end 
end 

config.active_job.queue_adapter = :delayed_job 

# config/initializers/delayed_job_config.rb

Delayed::Worker.max_attempts = 1 
Delayed::Worker.max_run_time = 12.hours 

答えて

1

あなたはすでにをチェックするRunReportsJob.perform_later(param1, param2, param3)前にいくつかのロジックを追加する必要がありますキューに入れられたジョブの優先順位Yこの例では優先順位番号(小さい番号がマニュアルに従って優先順位が高い)キューを増やす:

highest_priority = Delayed::Job.where(queue: :RunReports).maximum(:priority) 
Delayed::Worker.default_priority = highest_priority + 1 if highest_priority 

RunReportsJob.perform_later(param1, param2, param3) 

DelayedJobは、私は必要な情報がhttps://github.com/collectiveidea/delayed_job#gory-details

+0

でドキュメントをチェックすべてのジョブを保存するためのテーブルを使用しています2番目のジョブは、1番目以降の待ち行列にジョブを呼び出す。キューに既に何かがある場合は、ここに示したコードは何もしません。 –

+0

これは私が探しているものでしょうか?: 'Delayed :: Worker.read_ahead = 1'。デフォルト値が5の場合、delayed_jobはデータベースの最後の5つを同時に実行しようとしますか? –

+0

オハイオ州、私はそれを今すぐ取得することができますこれは優先順位を使用して達成することができます、私は答えコード – neydroid

関連する問題