Railsの機能にActiveJobというものがあって、これを使うとバックグラウンドで動くジョブを登録できたり、コマンドラインからRailsに触れたりするみたいです。
ActionCableの使い方を調べていて、サーバーのコマンドラインからクライアントに対して何かできたらいいなぁ〜と思っていたので、まずActiveJobの使い方を調べることにしました。
ジョブをつくる
rails
コマンドで作成できるみたいです。
rails generate job HelloWorld
app/jobs
ディレクトリの下に、ファイルが作成されました。
create test/jobs/hello_world_job_test.rb
create app/jobs/hello_world_job.rb
作成されたファイルを開き、perform
メソッドの中に実行したいことを書いていくようです。
app/jobs/hello_world_job.rb
class HelloWorldJob < ApplicationJob
queue_as :default
def perform(*args)
puts "ジョブが実行されたよ!\(^o^)/"
end
end
ジョブを実行する
ジョブを作ったはいいけど、どうやって実行させればいいのかわかりません。どうしましょう。
rails consoleから実行する
とりあえずrails console
から実行してみます。
rails console
ジョブを実行するにはperform_now
というクラスメソッドを実行します。
rails_console
HelloWorldJob.perform_now
こんな感じになりました。async
って書いてあるので非同期で実行されたのでしょう。おそらく、ええはい、、、
2.3.0 :001 > HelloWorldJob.perform_now
Performing HelloWorldJob from Async(default)
ジョブが実行されたよ!\(^o^)/
Performed HelloWorldJob from Async(default) in 0.1ms
=> nil
コマンドラインから実行する
rakeコマンドを使えばできるような気がします。
rakeのタスクを作るのもrails
コマンドでできるみたいです。すごいですね!
rails generate task job helloworld
タスクはlib
ディレクトリの中に作成されるんですね。
create lib/tasks/job.rake
作成されたファイルはこんな感じになっています
lib/tasks/job.rake
namespace :job do
desc "TODO"
task helloworld: :environment do
end
end
説明と実行する処理を書いてこうなりました。
lib/tasks/job.rake
namespace :job do
desc "HelloWorldJobを実行する"
task helloworld: :environment do
HelloWorldJob.perform_now
end
end
実行してみます。
最近はrakeタスクの実行もrails
コマンドでやるみたいですね。知りませんでした。
console
rails job:helloworld
うまくいきました。
ジョブが実行されたよ!\(^o^)/