これをhttps://github.com/collectiveidea/delayed_jobで表示している場合は、マスターブランチのドキュメントを読んでいます。最新リリース(4.1.13)のドキュメントを表示します。
遅延::ジョブ(またはDJ)は、バックグラウンドでより長いタスクを非同期に実行する共通のパターンをカプセル化します。
これは、ジョブテーブルが多数のコアタスクを担当するShopifyからの直接抽出です。これらのタスクの中には、
大規模なニュースレターを送信します
画像サイズ変更
HTTPダウンロード
スマートコレクションの更新
製品が変更された後、検索サーバーであるSolrを更新します
バッチインポート
スパムチェック
Twitterでフォローして、更新と新しいリリースについての通知を取得してください。
delaed_job 3.0.0は、Rails 3.0+のみをサポートしています。
delayed_jobは、ジョブキューを保存するための複数のバックエンドをサポートします。他のバックエンドについては、wikiを参照してください。
Active Recordでdelayed_jobを使用する予定の場合は、 Gemfile
にdelayed_job_active_record
を追加します。
gem 'delayed_job_active_record'
Mongoidでdelayed_jobを使用する場合は、 Gemfile
にdelayed_job_mongoid
を追加します。
gem 'delayed_job_mongoid'
bundle install
実行して、バックエンドとdelaed_job gemsをインストールします。
アクティブなレコードバックエンドには、ジョブテーブルが必要です。次のコマンドを実行して、そのテーブルを作成できます。
rails generate delayed_job:active_record rake db:migrate
レール4.2+については、以下を参照してください
開発モードでは、Rails 3.1+を使用している場合、アプリケーションコードは100ジョブごとに自動的にリロードされます。開発中にコードを更新するたびに、遅延したジョブを再起動する必要はありません。
Rails 4.2+で、config/application.rbにqueue_adapterを設定します
config.active_job.queue_adapter =:delayed_job
詳細については、Railsガイドを参照してください。
Protected_attributes GEMを使用している場合、GemfileのDelayed_jobの前に表示する必要があります。あなたの仕事が失敗している場合:
ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR: null value in column "handler" violates not-null constraint
次に、これがあなたが探している修正です。
遅延ジョブ3.0.0では、delayed_jobsテーブルに新しい列を導入します。
遅延ジョブ2.xからアップグレードしている場合は、アップグレードジェネレーターを実行して移行を作成して列を追加します。
rails generate delayed_job:upgrade rake db:migrate
任意のオブジェクトで.delay.method(params)
を呼び出すと、バックグラウンドで処理されます。
#遅延なしで[email protected]!(@device)#[email protected]!(@device)
メソッドを常にバックグラウンドで実行する必要がある場合は、メソッド宣言の後に#handle_asynchronously
電話をかけることができます。
クラスデバイス def#longruningメソッドを配信します 終わり handle_asynchronally:dervirenddevice = device.newdevice.deliver
#handle_asynchronously
and #delay
これらのパラメーターを取ります:
:priority
(number):低い数字は最初に実行されます。デフォルトは0ですが、再構成できます(以下を参照)
:run_at
(time):この時間の後に仕事を実行する(おそらく将来)
:queue
(string):このジョブを入れるための名前のキュー、優先順位の代替(以下を参照)
これらのパラマはProcオブジェクトである可能性があり、値のコールタイム評価を可能にします。
例えば:
クラスのロングタスク def send_mailer#他のコード 終わり handle_asynchronally:send_mailer、:priority => 20 def in_the_future#他のコード 終わり #5.minutes.from_nowは、in_the_futureが呼び出されたときに評価されます handle_asynchronally:in_the_future、:run_at => proc.new {5.minutes.from_now} def self.when_to_run2.hours.from_now 終わり class << selfdef call_a_class_method#他のCodeEndle_asynchronally:call_a_class_method、:run_at => proc.new {when_to_run} 終わり attr_reader:how_important def call_an_instance_method#他のコード 終わり handle_asynchronally:call_an_instance_method、:priority => proc.new {| i | I.how_important} end
たとえば、コンソールで何かをデバッグするときに、ジョブを遅らせることなくhandle_asynchronously
'dメソッドを呼び出したい場合は、メソッド名に_without_delay
を追加してください。たとえば、元の方法がfoo
の場合は、 foo_without_delay
に電話してください。
遅延ジョブは、レールメーラーに特別な構文を使用します。 .delay
使用するときは、 .deliver
メソッドを呼び出しないでください。
#遅延なしでdelayed_jobnotifier.signup(@user).deliver#delayed_jobnotifier.delay.signup(@user) 、.delay methodnotifier.with(foo:1、bar:2).delay.signup(@user)と.delay methodnotifierの前に、。
また、Active Jobを使用してアクションメーラーを使用することを検討することもできます。アクションメーラーは、フードの下でのジョブの遅延に転送する便利な.deliver_later
構文を提供します。
DJ 3は、DJスタイルの優先順位を保持しながら、キューという名前の名前の名前を導入します。目標は、個別にスケーリングおよび制御される可能性のある別々の労働者のプールで機能するタスクをグループ化するためのシステムを提供することです。
queue
オプションを設定して、キューにジョブを割り当てることができます。
object.delay(:queue => 'tracking')
名前付きキューのデフォルト優先順位を構成できます。
遅延:: worker.queue_attributes = { high_priority:{priority:-10}、 low_priority:{priority:10}}
構成されたキューの優先順位は、遅延方法に優先順位を渡すことによりオーバーライデンになる可能性があります
object.delay(:queue => 'high_priority'、優先度:0).method
以下に定義されているqueue
とqueues
オプションを使用して、特定のキューのみを動作させるためにプロセスを開始できます。キューを指定せずに開始されたプロセスは、キューからジョブを実行します。キューが指定されていないジョブを実行するプロセスを効果的に実行するには、 Delayed::Worker.default_queue_name
でデフォルトのキュー名を設定し、プロセスをそのキューを実行させます。
script/delayed_job
使用して、ジョブの動作を開始するバックグラウンドプロセスを管理できます。
そうするために、 gem "daemons"
Gemfile
に追加し、 rails generate delayed_job
実行することを確認してください。
その後、次のことを行うことができます。
RAILS_ENV=production script/delayed_job start RAILS_ENV=production script/delayed_job stop # Runs two workers in separate processes. RAILS_ENV=production script/delayed_job -n 2 start RAILS_ENV=production script/delayed_job stop # Set the --queue or --queues option to work from a particular queue. RAILS_ENV=production script/delayed_job --queue=tracking start RAILS_ENV=production script/delayed_job --queues=mailers,tasks start # Use the --pool option to specify a worker pool. You can use this option multiple times to start different numbers of workers for different queues. # The following command will start 1 worker for the tracking queue, # 2 workers for the mailers and tasks queues, and 2 workers for any jobs: RAILS_ENV=production script/delayed_job --pool=tracking --pool=mailers,tasks:2 --pool=*:2 start # Runs all available jobs and then exits RAILS_ENV=production script/delayed_job start --exit-on-complete # or to run in the foreground RAILS_ENV=production script/delayed_job run --exit-on-complete
Rails 4: Script/delayed_jobをbin/delayed_jobに置き換えます
データベースにアクセスし、クロックが同期している限り、労働者はどのコンピューターでも実行できます。各ワーカーは、少なくとも5秒ごとにデータベースをチェックすることに注意してください。
また、 rake jobs:work
は仕事を始めます。 CTRL-C
でレーキタスクをキャンセルできます。
利用可能なすべてのジョブを実行して終了したい場合は、 rake jobs:workoff
QUEUE
またはQUEUES
環境変数を設定して、キューをオフにします。
QUEUE=tracking rake jobs:work QUEUES=mailers,tasks rake jobs:work
次の構文は、遅延したジョブを再起動します:
RAILS_ENV=production script/delayed_job restart
複数のdelayed_jobワーカーを再起動するには:
RAILS_ENV=production script/delayed_job -n2 restart
Rails 4: Script/delayed_jobをbin/delayed_jobに置き換えます
ジョブは、パフォーマンスと呼ばれるメソッドを備えたシンプルなルビーオブジェクトです。実行に応答するオブジェクトは、ジョブテーブルに詰め込むことができます。ジョブオブジェクトはYAMLにシリアル化されているため、後にジョブランナーによって復活することができます。
newsletterjob = struct.new(:text、:emails)do def performemails.eact {| e | newslettermailer.deliver_text_to_email(text、e)} EndendDelayed :: job.enqueue newsletterjob.new( 'lorem ipsum ...'、customers.pluck(:email))
遅延:: worker.max_attemptsをオーバーライドするジョブごとの最大試行を設定するには、ジョブ上のmax_attemptsメソッドを定義できます
newsletterjob = struct.new(:text、:emails)do def performemails.eact {| e | newslettermailer.deliver_text_to_email(text、e)} 終わり def max_attempts3 エンデンド
遅延:: worker.max_run_timeをオーバーライドするジョブごとの最大実行時間を設定するには、ジョブでmax_run_timeメソッドを定義できます
注:これは、遅延:: worker.max_run_timeよりも低いmax_run_timeを設定するためにのみ使用できます。それ以外の場合、ジョブのロックが期限切れになり、別の労働者が進行中のジョブの作業を開始します。
newsletterjob = struct.new(:text、:emails)do def performemails.eact {| e | newslettermailer.deliver_text_to_email(text、e)} 終わり def max_run_time120#秒 エンデンド
遅延:: worker.destroy_failed_jobsをオーバーライドする失敗したジョブを破壊するためのジョブごとのデフォルトを設定するには、Destroy_failed_jobsを定義できますか?ジョブの方法
newsletterjob = struct.new(:text、:emails)do def performemails.eact {| e | newslettermailer.deliver_text_to_email(text、e)} 終わり DEF DESTRY_FAILED_JOBS?false エンデンド
遅延:: worker.default_queue_nameをオーバーライドするカスタムジョブのデフォルトのキュー名を設定するには、ジョブ上のqueue_nameメソッドを定義できます
newsletterjob = struct.new(:text、:emails)do def performemails.eact {| e | newslettermailer.deliver_text_to_email(text、e)} 終わり def queue_name'newsletter_queue ' エンデンド
エラー時に、ジョブは5秒 + n ** 4で再びスケジュールされます。ここで、nは試行回数です。独自のreschedule_at
メソッドを定義して、このデフォルトの動作をオーバーライドできます。
newsletterjob = struct.new(:text、:emails)do def performemails.eact {| e | newslettermailer.deliver_text_to_email(text、e)} 終わり def reschedule_at(current_time、regids)current_time + 5.seconds エンデンド
プロセスのさまざまな段階で呼び出される仕事のフックを定義できます。
注: ActiveJobを使用している場合、これらのフックは仕事に利用できません。 ActiveJobのコールバックを使用する必要があります。詳細はhttps://guides.rubyonrails.org/act_job_basics.html#callbacksです
クラスparanoidnewsletterjob <newsletterjob def enqueue(job)record_stat 'newsletter_job/enqueue' 終わり def performemails.eact {| e | newslettermailer.deliver_text_to_email(text、e)} 終わり def before(job)record_stat 'newsletter_job/start' 終わり def after(job)record_stat 'newsletter_job/after' 終わり def success(job)record_stat 'newsletter_job/success' 終わり defエラー(ジョブ、例外)airbrake.notify(例外) 終わり DEF FALION(job)page_sysadmin_in_the_middle_of_the_night エンデンド
ライブラリは、次のように見える遅延_jobsテーブルを中心に展開します。
create_table:delayed_jobs、:force => true do | table | table.integer:優先度、:デフォルト=> 0#いくつかのジョブがキューの前面にジャンプできるようにします table.integer:試行、:default => 0#は再試行を提供しますが、最終的には失敗します。 表:テキスト:機能するオブジェクトのハンドラー#yamlエンコード文字列 表:テキスト:last_error#最後の失敗の理由(以下の注を参照) table.dateTime:run_at#いつ実行するか。すぐに、あるいは将来的には時間がかかる可能性があります。 table.dateTime:locked_at#クライアントがこのオブジェクトで作業しているときに設定 table.dateTime:すべての再試行が失敗したときにfailed_at##設定されています(実際、デフォルトでは、代わりにレコードが削除されます) テーブル。ストリング:Locked_by#このオブジェクトで作業している人(ロックされている場合) 表。ストリング:キュー#このジョブがあるキューの名前 table.timestampsend
エラー時に、ジョブは5秒 + n ** 4で再びスケジュールされます。nは試行回数またはジョブの定義されたreschedule_at
メソッドを使用します。
デフォルトのWorker.max_attempts
は25です。この後、ジョブは削除(デフォルト)か、「failed_at」セットでデータベースに残されます。デフォルトの25回の試行で、最後の再試行は20日後になり、最後の間隔はほぼ100時間です。
デフォルトのWorker.max_run_time
は4.hoursです。あなたの仕事がそれより時間がかかる場合、別のコンピューターがそれを拾うことができます。あなたの仕事がこの時間を超えないようにするのはあなた次第です。これを、仕事ができると思う最長の時間に設定する必要があります。
デフォルトでは、失敗したジョブを削除します(そして、常に成功したジョブを削除します)。失敗したジョブを維持したい場合は、 Delayed::Worker.destroy_failed_jobs = false
を設定します。失敗したジョブには、null null failed_atがマークされます。
デフォルトでは、すべてのジョブはpriority = 0
でスケジュールされます。これは最優先事項です。これを変更するとDelayed::Worker.default_priority
を他の何かに設定できます。より低い数の優先度が高くなります。
デフォルトの動作は、利用可能なジョブを見つけるときにキューから5つのジョブを読むことです。これを設定して、 Delayed::Worker.read_ahead
て設定できます。
デフォルトでは、すべてのジョブは名前付きキューなしでキューに掲載されます。 Delayed::Worker.default_queue_name
を使用して、デフォルトの名前のキューを指定できます。
ジョブが見つからない場合、労働者は睡眠遅延オプションで指定された時間の間睡眠をとります。 60秒の睡眠時間のためにDelayed::Worker.sleep_delay = 60
を設定します。
遅延ジョブをテスト目的で無効にすることができます。 SET Delayed::Worker.delay_jobs = false
すべてのジョブをリアルタイムで実行します。
またはDelayed::Worker.delay_jobs
ジョブごとにインラインでジョブを実行するかどうかを決定するProcになります。
遅延:: worker.delay_jobs = - >(job){ job.queue!= 'inline'}
Sigterm Signalsの例外を提起する必要がある場合があります。 Delayed::Worker.raise_signal_exceptions = :term
、ランニングジョブを中止してロック解除するために、労働者がSignalException
を引き起こし、他の労働者が仕事を利用できるようにします。このオプションのデフォルトはfalseです。
レールのジョブパラメーターを変更する例は次のとおりです。
# config/initializers/delayed_job_config.rbDelayed::Worker.destroy_failed_jobs = falseDelayed::Worker.sleep_delay = 60Delayed::Worker.max_attempts = 3Delayed::Worker.max_run_time = 5.minutesDelayed::Worker.read_ahead = 10Delayed::Worker.default_queue_name = 'default'delayed :: worker.delay_jobs =!rails.env.test?delayed :: worker.raise_signal_exceptions =:termdelayed :: worker.logger.new(file.join(rails rot、' log '、'」 delayed_job.log '))
rake jobs:clear
。
助けを得るのに良い場所は次のとおりです。
メーリングリストに参加できるGoogleグループ。
StackOverflow