rails4.2をいじってみる(ActiveJobs)
Rails4.2の最新機能のActiveJobを使おうと思い、少し調べてみました
$gem install rails --version '~>4.2.0.beta1'
このActiveJobは4.2から新たに追加されるキューイングのフレームワークです。
何か動かしながらと思い、サンプルプロジェクト作成。
$ rails new testActiveJob
まずはscaffoldでサンプル用を作成してみます。
rails g scaffold user name age:integer
続いてjobクラスを作成(生成)
rails g job hello
これでapp/jobs/hello_job.rbが生成されます。
class HellloJob < ActiveJob::Base queue_as :urgent def perform(message = 'test') # Do something later puts message end end
今回使うバックエンドはdelayed_jobです。
gem 'delayed_job' gem 'delayed_job_active_record' gem 'daemons'
またどのキューを使うのかActiveJobの設定を追加します。
ActiveJob::Base.queue_adapter = :delayed_job
次にdelayed_jobの起動スクリプトを作成(生成)します。
rails g delayed_job:active_record
rake db:migrate
ではdelayed_jobを起動しましょう。
bin/delayed_job restart &
続いて、サンプルアプリケーションを起動してjobのキューイングをしましょう。
# GET /users/1 # GET /users/1.json def show HelloJob.enqueue 'ほげほげほげ' HelloJob.enqueue_in 1.minute, 'うごうぐぐ' end
上記のような感じで書けば、キューイングされます。以下にキューイングされた時のログを載せます。
少し前までは、サイトの使い方説明にはperform_laterメソッドなどを使えって書いてありましたが、変わったようですね。実際ソース見るとActiveJob:: Enqueuingモジュールにenqueueメッソドが定義されています。
このActiveJob:: EnqueuingモジュールはActiveJob:Baseクラスでincludeされているので、先ほど作成したJobクラスを継承することでenqueueが使えるようになるわけです。
[ActiveJob] Enqueued HelloJob (Job ID: 2f645884-aabb-47e4-b1bd-9f4635c91b15) to DelayedJob(my_job) with arguments: "ほげほげほげ"
[ActiveJob] (0.1ms) begin transaction
[ActiveJob] SQL (0.4ms) INSERT INTO "delayed_jobs" ("created_at", "handler", "queue", "run_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", "2014-09-09 10:06:57.903401"], ["handler", "--- !ruby/object:Delayed::PerformableMethod\nobject: !ruby/object:ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper {}\nmethod_name: :perform\nargs:\n- !ruby/class 'HelloJob'\n- 2f645884-aabb-47e4-b1bd-9f4635c91b15\n- \"ほげほげほげ\"\n"], ["queue", "my_job"], ["run_at", "2014-09-09 10:06:57.902925"], ["updated_at", "2014-09-09 10:06:57.903401"]]
[ActiveJob] (0.7ms) commit transaction
[ActiveJob] Enqueued HelloJob (Job ID: c08906d5-8564-4224-9392-4c4670462067) to DelayedJob(my_job) at 2014-09-09 10:07:57 UTC with arguments: "うごうぐぐ"
[ActiveJob] (0.0ms) begin transaction
[ActiveJob] SQL (0.2ms) INSERT INTO "delayed_jobs" ("created_at", "handler", "queue", "run_at", "updated_at") VALUES (?, ?, ?, ?, ?) [["created_at", "2014-09-09 10:06:57.908070"], ["handler", "--- !ruby/object:Delayed::PerformableMethod\nobject: !ruby/object:ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper {}\nmethod_name: :perform\nargs:\n- !ruby/class 'HelloJob'\n- c08906d5-8564-4224-9392-4c4670462067\n- \"うごうぐぐ\"\n"], ["queue", "my_job"], ["run_at", "2014-09-09 10:07:57.906096"], ["updated_at", "2014-09-09 10:06:57.908070"]]
[ActiveJob] (0.8ms) commit transaction
参考にしたのは、ここ
ただまだ正式リリースではないので、この先もまだばんばん変わるかも。
取りあえず、試しに使う分には使えますね。
あとActiveRecordをキューにいれる方法については、別途次回以降で書こうと思います