実行方法について解説します。Jobは、ジョブを宣言し、それによってバックエンドでさまざまな方法によるキュー操作を実行するためのフレームワークです。ジョブには、定期的なクリーンアップを始めとして、請求書発行やメール配信など、あらゆる処理がジョブになります。これらのジョブをより細かな作業単位に分割して並列実行することもできます。Jobの主要な目的は、あらゆるRailsアプリケーションにジョブ管理インフラを配置することです。JobとResqueなどのように、さまざまなジョブ実行機能のAPIの違いを気にせずにジョブフレームワーク機能やその他のgemを搭載することができるようになります。バックエンドでのキューイング作業では、操作方法以外のことを気にせずに済みます。ジョブ管理フレームワークを切り替える際にジョブを書き直さずに済みます。デフォルトのRailsは非同期キューを実装します。これは、インプロセスのスレッドプールでジョブを実行します。ジョブは非同期に実行されますが、再起動するとすべてのジョブは失われます。方法を手順を追って説明します。Jobは、ジョブ作成用のRailsジェネレータを提供しています。以下を実行すると、app/jobsにジョブが1つ作成されます。app/jobs/guests_cleanup_job.rb以下のようにすると、特定のキューに対してジョブを1つ作成できます。urgentジェネレータを使いたくない場合は、app/jobsの下に自分でジョブファイルを作成することもできます。ジョブファイルでは必ずApplicationJobを継承してください。作成されたジョブは以下のようになります。ジョブをキューに登録するキューへのジョブ登録は以下のように行います。'some_filter')以上でジョブ登録は完了です。ジョブを実行するproduction環境でのジョブのキュー登録と実行では、キューイングのバックエンドを用意しておく必要があります。具体的には、Railsで使うべきサードパーティのキューイングライブラリを決める必要があります。Rails自身が提供するのは、ジョブをメモリに保持するインプロセスのキューイングシステムだけです。プロセスがクラッシュしたりコンピュータをリセットしたりすると、デフォルトの非同期バックエンドの振る舞いによって主要なジョブが失われてしまいます。アプリケーションが小規模な場合やミッションクリティカルでないジョブであればこれでも構いませんが、多くのproductionでは永続的なバックエンドを選ぶ必要があります。Jobなどさまざまなキューイングバックエンドに接続できるアダプタがビルトインで用意されています。バックエンドを設定するキューイングバックエンドの設定は簡単です。デプロイ方法に従うこと。endend次のように、ジョブごとにバックエンドを設定することもできます。起動しておくことが求められます。キューのバックエンドの起動方法については、ライブラリのドキュメントを参照してください。以下はドキュメントのリストの一部です(すべてを網羅しているわけではありません)。多くのアダプタでは複数のキューを扱えます。Jobを使って、特定のキューに入っているジョブをスケジューリングできます。#....endapplication.rbで以下のようにconfig.active_job.queue_name_prefixを使用することで、すべてのジョブでキュー名の前に特定の文字列を追加することができます。実行されるようになり、staging環境ではstaging_low_priorityというキューでジョブが実行されるようになりますキュー名のプレフィックスのデフォルト区切り文字は'_'です。application.rbのconfig.active_job.queue_name_delimiterを設定することでこの区切り文字を変更できます。実行されるようになり、staging環境ではstaging.low_priorityというキューでジョブが実行されるようになりますジョブを実行するキューをさらに細かく制御したい場合は、#setに:queueオプションを追加できます。:another_queue).perform_later(record)#queue_asにブロックを渡すと、キューをそのジョブレベルで制御できます。(これによりself.argumentsにアクセスできるようになります)。キュー名を返さなくてはなりません。endendProcessVideoJob.perform_later(Video.last)設定したキュー名をキューイングバックエンドが「リッスンする」ようにしてください。一部のバックエンドでは、リッスンするキューを指定する必要があるものがあります。Jobが提供するフックを用いて、ジョブのライフサイクル中にロジックをトリガできます。これらのコールバックは、Railsの他のコールバックと同様に通常のメソッドとして実装し、マクロ風のクラスメソッドでコールバックとして登録できます。endendこのマクロスタイルのクラスメソッドは、ブロックを1つ受け取ることもできます。ブロック内のコード量が1行以内に収まるほど少ない場合は、この書き方をご検討ください。登録されたジョブごとの測定値を送信する場合は次のようにします。Mailer最近のWebアプリケーションでよく実行されるジョブといえば、リクエスト-レスポンスのサイクルの外でメールを送信することでしょう。これにより、ユーザーが送信を待つ必要がなくなります。Mailerと統合されているので、非同期メール送信を簡単に行えます。Jobを使用して後でメール送信したい場合は#deliver_laterを使用UserMailer.welcome(@user).deliver_later一般に、非同期キュー(.deliver_laterでメールを送信するなど)はRakeタスクに書いても動きません。Rakeが終了すると、.deliver_laterがメールの処理を完了する前にインプロセスのスレッドプールを削除する可能性があるためです。この問題を回避するには、.deliver_nowを用いるか、development環境で永続的キューを実行してください。国際化(i18n)各ジョブでは、ジョブ作成時に設定されたI18n.localeを使います。これはメールを非同期的に送信する場合に便利です。Jobの引数では、デフォルトで以下の型をサポートします。JobではGlobalIDがパラメータとしてサポートされています。Recordオブジェクトをジョブに渡す際にクラスとidを指定する必要がありません。する必要がありました。従来のジョブが以下のようなものだったとします。endend現在は以下のように簡潔に書くことができます。endend上のコードは、ActiveModel::GlobalIdentificationをミックスインするすべてのクラスで動作します。Recordクラスにデフォルトでミックスインされます。シリアライザサポートされる引数の型は、以下のような独自のシリアライザを定義するだけで拡張できます。あるオブジェクトを、オブジェクト型をサポートするもっとシンプルな表現形式に変換する。表現形式としては特定のキーを持つハッシュが推奨される。キーには基本型のみが利用可能。endend続いてこのシリアライザをリストに追加します。Jobでは、ジョブ実行時に発生する例外をキャッチする方法が1つ提供されています。失敗したジョブをリトライまたは廃棄する実行中に例外が発生したジョブのリトライや廃棄も行えます。次の例をご覧ください。APIドキュメントを参照してください。Recordオブジェクトを渡してシリアライズできます。JobによってActiveJob::DeserializationErrorエラーがraiseされます。ジョブをテストするジョブのテスト方法について詳しくは、テスティングガイドをご覧ください。Railsガイドを、もっと便利に。本サービスで得られた売上はRailsガイドを継続的に更新・運営するために活用させていただきます。管理・公開されております。出して頂けると嬉しいです。:)本ガイドの品質向上に向けて、皆さまのご協力が得られれば嬉しいです。株式会社https://yasslab.jp/支援・協賛Railsガイドは下記のサポーターから継続的な支援を受けています。ライセンスに基づいて公開されています。よる登録商標で、すべての権利を有しています。