アカハヤのブログ

クズと天才は紙一重 twitter:@akahaya719

Sidekiq

RailsのActiveJobには、未来に登録したJobをキャンセルするサポートがありません。

 

なので、Job実行にSidekiqを使い、キャンセルにSidekiqのAPIを使います。

 

Gemfileに以下を追加して、bundle install

gem 'sidekiq'

 

config/sidekiq.ymlに以下を記述

:concurrency: 25
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:queues:
 - default

 

Active JobがSidekiqを使用することを、config/application.rbに記述する。

config.active_job.queue_adapter = :sidekiq

 

キャンセルはこんな感じで行います。

 

require 'sidekiq/api'
job = ジョブ名.set(wait_until: Date.tomorrow.noon).perform_later(*args)
job.job_id #これでジョブを特定するIDがわかる

job_list = Sidekiq::ScheduledSet.new
job_list.find{ |job| job.arga[0]['job_id'] == job.job_id }.delete

 

ジョブ実行をSidekiqに変更したので、ローカル開発時は

redis-serverでRedisを立ち上げた後、

別ターミナルでbundle exec sidekiqでSidekiqを立ち上げて

Jobを使いましょう