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をキューにいれる方法については、別途次回以降で書こうと思います