Ответ 1
Правильно, единственный способ остановить работу - это остановить работу. Ваше приложение должно реализовать эту логику.
https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-cancel-a-sidekiq-job
Поэтому мне нужно остановить запуск Job в Sidekiq (3.1.2) программно, а не запланированный. Я прочитал документацию API, но ничего не нашел об отмене текущих заданий. Возможно ли это с sidekiq?
Если это невозможно, моя идея состояла в том, чтобы обойти это, подняв исключение в задании, когда я вызываю сигнал, а затем удаляю задание из retryset. Это явно не оптимально.
Заранее спасибо
Правильно, единственный способ остановить работу - это остановить работу. Ваше приложение должно реализовать эту логику.
https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-cancel-a-sidekiq-job
Если вы знаете длительный идентификатор потока задания, его можно завершить из другой задачи:
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, вам нужно будет выполнить эту задачу, пока она не будет запущена на том же экземпляре.