отмена запланированной работы Sidekiq в Rails - PullRequest
0 голосов
/ 10 декабря 2018

Для некоторых заданий Sidekiq в моем приложении запланировано изменение состояния ресурса на cancelled, если пользователь не ответит в течение определенного периода времени.Существует лот из информации о о том, как лучше всего выполнить эту задачу, но ни один из них на самом деле не отменяет работу.

Чтобы отменить работу, код в вики говорит:

class MyWorker
 include Sidekiq::Worker

 def perform(thing_id)
  return if cancelled?
  thing = Thing.find thing_id
  thing.renege!
 end

 def cancelled?
  Sidekiq.redis {|c| c.exists("cancelled-#{jid}") }
 end

 def self.cancel!(jid)
  Sidekiq.redis {|c| c.setex("cancelled-#{jid}", 86400, 1) }
 end
end

Все же здесь предлагается, чтобы я сделал что-то вроде

 def perform(thing_id)
  thing = Thing.find thing_id
  while !cancel?(thing)
   thing.ignore!
  end
 end

 def cancel?(thing_id)
  thing = Thing.find thing_id
  thing.matched? || thing.passed?
 end

Что сбивает с толкуоб этом и аналогичном коде в вики нет ничего, что фактически отменяет работу.Приведенный выше пример просто выполняет обновление для thing, если cancelled? возвращает false (как и должно быть), но не отменяет, если и когда он вернет true в будущем.Это просто терпит неудачу с сообщением об ошибке перехода AASM и отправляется RetrySet.Вызов MyWorker.cancel! jid в коде модели выдает неопределенную ошибку переменной.Как я могу получить доступ к этому jid в модели?Как на самом деле отменить или удалить эту конкретную работу?Спасибо!

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Вы можете сделать это, но это не будет эффективным.Это линейное сканирование для поиска запланированной работы по JID.

require 'sidekiq / api' Sidekiq :: ScheduledSet.new.find_job (jid) .try (: delete) В качестве альтернативы ваша работа может посмотреть, если онавсе еще актуально, когда он запускается.

0 голосов
/ 19 декабря 2018

Хорошо, получается, у меня уже был один вопрос.Один из наборов кода, который я включил, был функционально похожей версией кода из вики.Решение другого вопроса («как я могу получить доступ к этому jid в модели?») Кажется действительно очевидным, если вы еще не знакомы с программированием, но в основном: сохраните jid в столбце базы данных, а затем извлекайте / обновляйте его всякий раз, когдаэто нужно!Duh!

0 голосов
/ 13 декабря 2018
# The wiki code
class MyWorker
 include Sidekiq::Worker

 def perform(thing_id)
  return if cancelled?

  # do actual work
 end

 def cancelled?
  Sidekiq.redis {|c| c.exists("cancelled-#{jid}") }
 end

 def self.cancel!(jid)
  Sidekiq.redis {|c| c.setex("cancelled-#{jid}", 86400, 1) }
 end
end

# create job
jid = MyWorker.perform_async("foo")

# cancel job
MyWorker.cancel!(jid)
...