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