Для некоторых заданий 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 в модели?Как на самом деле отменить или удалить эту конкретную работу?Спасибо!