← 記事一覧に戻る

ActiveJobをSidekiq-cronで実行する時はactive_jobを明示しないとダメだよ

2025/8/24
Rails Sidekiq ActiveJob

Doorkeeperを用いてtokenの発行や保存を行なっていると、徐々に期限切れtokenやrevokeされたtokenがデータベースに蓄積されていく。そのため、Doorkeeperではそれらのtokenデータを削除するRakeタスクが用意されている。

https://doorkeeper.gitbook.io/guides/internals/rake

自分が関わっているプロダクトでは、このRakeタスクは定期スケジュールされており、毎日午前3時に実行されることとなっているが、実行されていないことに先日気づいた。

↓schedule.yaml

clean_up_job:
  cron: "0 3 * * * Asia/Tokyo"
  class: "CleanUpJob"

本番のlogからは undefined method perform_asyncと出力されており、perform_asyncが定義されていないようだった。 CleanUpJobを確認してみるとApplicationJobが継承されていたため、CleanUpJobがSidekiq JobではなくActiveJobとみなされていたことが原因だった。

class CleanUpJob < ApplicationJob
  extend T::Sig

  sig { void }
  def perform
    system("bundle exec rake doorkeeper:db:cleanup", exception: true)
  end
end

Sidekiq Jobとして実行するにはschedule.yamlにactive_job: trueを明示する必要があったため、以下のように修正すると正常に実行されるようになった。

clean_up_job:
  cron: "0 3 * * * Asia/Tokyo"
  class: "CleanUpJob"
  active_job: true