2014-09-17 2 views
11

Так что мне нужно остановить работает Работа в Sidekiq (3.1.2) программно, а не по расписанию. Я прочитал документацию API, но ничего не нашел об отмене текущих заданий. Возможно ли это с sidekiq?Sidekiq stop one single, running job

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

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

+0

Как вы решили эту проблему? Не могли бы вы поделиться своим обходом? – lazywei

+0

Посмотрите FAQ по первому ответу, это очень хорошо объясняет идею. Я сделал что-то подобное, добавив несколько точек останова для выполнения действия (т. Е. В начале каждого блока). Это в значительной степени зависит от вашего варианта использования, когда/когда вы хотите прекратить выполнение вашего метода выполнения. – Figedi

ответ

7

Правильно, единственный способ остановить работу для задания, чтобы остановить себя. Ваше приложение должно реализовать эту логику.

https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-cancel-a-sidekiq-job

+0

Не могли бы вы подробнее рассказать об этом? Я не знаю, как остановить работу самостоятельно – lazywei

+0

добавлена ​​ссылка на faq –

+0

Вау, я на самом деле вжился что-то похожее на эту версию, используя Redis и сохраняя все jids в хеше, а затем добавляя точки останова в моем методе выполнения, каждый раз проверяя был ли текущий jid установлен в redis – Figedi

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, вам нужно запустить эту задачу, пока она не будет запущена на том же экземпляре.

+0

Именно то, что я ищу !. Одна небольшая коррекция: в этот момент (2017) вы должны использовать 'object_id.to_s (36)'. – sigra

 Смежные вопросы

  • Нет связанных вопросов^_^