Job の開発
基底クラス
シラサギの Job は、Rails 標準の ActiveJob をほぼそのまま利用しますが、 一部、機能を拡張しています。
ActiveJob では次のようなジョブ・クラスを作成し、
class ExampleJob < ApplicationJob
def perform(param)
puts "hello #{param}"
end
end
ApplicationJob を派生したクラスを作成し、処理の内容を perform
メソッド内に実装します。
ジョブを実行するには次のようにします。
ExampleJob.perform_later('world')
シラサギで Job を開発する際、開発する機能に応じて継承する基底クラスが次のようになります。
モジュール名 | 基底クラス |
---|---|
システム | SS::ApplicationJob |
CMS | Cms::ApplicationJob |
GWS | Gws::ApplicationJob |
シラサギの Job の実装例:
class ExampleJob < Cms::ApplicationJob
def perform(param)
puts "hello #{param}"
end
end
実行コンテキスト
シラサギでジョブを実行する際、どのサイトをターゲットにしているのか、どのノードをターゲットとしているのかという実行コンテキストを把握することが重要です。
シラサギの Job では、実行コンテキストを指定する専用のメソッド bind
を提供し、意味をわかりやすくしています。
サイトとノードを bind
メソッドを使ってジョブに関連付けるには、次のようにします。
ExampleJob.bind(site_id: @cur_site, node_id: @cur_node).perform_later('world')
関連付けられたサイトやノードは、self.site
や self.node
で取得することができます。
ジョブの実装例を下に示します。
class ExampleJob < Cms::ApplicationJob
def perform(param)
puts "hello #{param} @ #{self.site.domain}, #{self.node.name}"
end
end
bind
に指定できるコンテキストはモジュールによって異なり、各モジュールでは、次のようなコンテキストを設定できます。
モジュール名 | site | group | user | node | page | member |
---|---|---|---|---|---|---|
システム | X (SS::Site) | X (SS::Group) | X (SS::User) | |||
CMS | X (Cms::Site) | X (Cms::Group) | X (Cms::User) | X | X | X (Cms::Node) |
GWS | X (Gws::Site) | X (Gws::User) |
ログの確認
Job 内から Rails.logger
により出力したログは自動的に保存され、ジョブの実行履歴から確認することができます。
CMS や GWS で実行履歴を確認するには、ジョブの実行時にサイトをジョブに関連付けなければなりません。 サイトがジョブに関連付けられていない場合、システムのジョブ実行履歴から確認することができます。
ログレベルの設定は config/job.yml(ファイルが存在しない場合 config/defaults/job.yml をコピー) の log_level にあります。
ここで設定しているレベル以上のログが記録されます。
動作確認方法
画面から実行しログを確認(画面で確認できる)してもいいですし、 動作確認ついでに RSpec を書いてもいいですしが、お勧めは、次のように Rails コンソールでジョブを実行する方法です。
Rails コンソールから perform_later
メソッドではなく、perform_now
メソッドを呼び出すことで、ジョブを即座に実行することができます。
ExampleJob.bind(site_id: Cms::Site.find(1), node_id: Cms::Node.find(138)).perform_now('world')
問題ある場合、ソースコードを修正し、Rails コンソールで reload!
を実行すると修正が即座に読み込まれます。
どうせ検証するんだから最初から RSpec 書けよ!という意見はごもっともだと思います。
好きなスタイルで開発してください。