Sidekiq останавливается на одном, работает

Поэтому мне нужно остановить запуск Job в Sidekiq (3.1.2) программно, а не запланированный. Я прочитал документацию API, но ничего не нашел об отмене текущих заданий. Возможно ли это с sidekiq?

Если это невозможно, моя идея состояла в том, чтобы обойти это, подняв исключение в задании, когда я вызываю сигнал, а затем удаляю задание из retryset. Это явно не оптимально.

Заранее спасибо

Ответ 2

Если вы знаете длительный идентификатор потока задания, его можно завершить из другой задачи:

class ThreadLightly
  include Sidekiq::Worker

  def perform(tid)
    puts "I'm %s, and I'll be terminating TID: %s..." % [self.class, tid]
    Thread.list.each {|t|
      if t.object_id.to_s == tid
        puts "Goodbye %s!" % t
        t.exit
      end
    }
  end
end

Вы можете запустить его из sidekiq_pusher:

bundle exec ./pusher.rb ThreadLightly $YOURJOBSTHREADID

Вам нужно будет регистрировать Thread.current.object_id для каждого задания, поскольку пользовательский интерфейс его не показывает. Кроме того, если вы запускаете распределенные sidekiqs, вам нужно будет выполнить эту задачу, пока она не будет запущена на том же экземпляре.