Open2

Delayed Job

seiya2130seiya2130

Delayed Jobとは

Railsで非同期処理を行うジョブキューライブラリ

なおRailsのActive JobSidekiqDelayed Job等のジョブキューライブラリの違いを気にせずにジョブ管理ができるライブラリ

使い方

インストール

gem 'delayed_job_active_record'

テーブル作成

ジョブ保存用のテーブルを作成

rails generate delayed_job:active_record
rails db:migrate

ジョブキューへの追加

class GuestsCleanupJob < ApplicationJob
  queue_as :default
  self.queue_adapter = :delayed_job

  def perform
    puts "hello"
  end
end
> GuestsCleanupJob.perform_later
  TRANSACTION (0.2ms)  BEGIN
  Delayed::Backend::ActiveRecord::Job Create (1.0ms)  INSERT INTO "delayed_jobs" ("priority", "attempts", "handler", "last_error", "run_at", "locked_at", "failed_at", "locked_by", "queue", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING "id"  [["priority", 0], ["attempts", 0], ["handler", "--- !ruby/object:ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper\njob_data:\n  job_class: GuestsCleanupJob\n  job_id: 9e765bcb-1ea0-4eda-9c52-7542af4692d1\n  provider_job_id:\n  queue_name: default\n  priority:\n  arguments: []\n  executions: 0\n  exception_executions: {}\n  locale: en\n  timezone: UTC\n  enqueued_at: '2024-12-15T06:19:54Z'\n"], ["last_error", nil], ["run_at", "2024-12-15 06:19:54.823268"], ["locked_at", nil], ["failed_at", nil], ["locked_by", nil], ["queue", "default"], ["created_at", "2024-12-15 06:19:54.823395"], ["updated_at", "2024-12-15 06:19:54.823395"]]
  TRANSACTION (0.6ms)  COMMIT
Enqueued GuestsCleanupJob (Job ID: 9e765bcb-1ea0-4eda-9c52-7542af4692d1) to DelayedJob(default)
=> 
#<GuestsCleanupJob:0x00000001098b6e60
 @arguments=[],
 @exception_executions={},
 @executions=0,
 @job_id="9e765bcb-1ea0-4eda-9c52-7542af4692d1",
 @priority=nil,
 @provider_job_id=2,
 @queue_name="default",
 @successfully_enqueued=true,
 @timezone="UTC">

ジョブの実行

% rake jobs:work
[Worker(host:xxx.local pid:16482)] Starting job worker
[Worker(host:xxx.local pid:16482)] Job GuestsCleanupJob [9e765bcb-1ea0-4eda-9c52-7542af4692d1] from DelayedJob(default) with arguments: [] (id=2) (queue=default) RUNNING
hello
[Worker(host:xxx.local pid:16482)] Job GuestsCleanupJob [9e765bcb-1ea0-4eda-9c52-7542af4692d1] from DelayedJob(default) with arguments: [] (id=2) (queue=default) COMPLETED after 0.0080
[Worker(host:xxx.local pid:16482)] 1 jobs processed at 21.5880 j/s, 0 failed

検証

https://github.com/seiya2130/rails_practice/pull/5/files

参考

https://railsguides.jp/active_job_basics.html
https://qiita.com/shunsuke227ono/items/c29119a348f120c5c13a

seiya2130seiya2130

ジョブ確認コマンド

ジョブの総数取得

Delayed::Job.count

ジョブの一覧取得

Delayed::Job.all

失敗しているジョブの取得

Delayed::Job.where.not(last_error: nil)

SQLの場合は以下
ジョブの総数取得

SELECT COUNT(*) FROM delayed_jobs;

失敗しているジョブの取得

SELECT * FROM delayed_jobs WHERE last_error IS NOT NULL;