我的应用程序中的某些Sidekiq作业计划将资源状态更改为cancelled
,除非用户在特定时间段内做出响应。有一种lot of information about如何最好地完成这项任务,但没有一个能真正取消工作。
要取消工作,Wiki中的代码显示:
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
还here,建议我做类似的事情
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
对此以及Wiki上类似代码的困惑在于,这实际上并没有取消工作。上面的示例仅在thing
返回cancelled?
(如应有)的情况下对false
执行更新,但在将来何时返回true时并不会取消。它只是失败并显示aasm转换错误消息,并被发送到RetrySet。在模型代码中调用MyWorker.cancel! jid
会引发未定义的变量错误。如何在模型中访问该ID?实际上如何取消或删除该特定工作?谢谢!
答案 0 :(得分:4)
# 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)
答案 1 :(得分:0)
您可以这样做,但是效率不高。这是一种线性扫描,可通过JID查找计划的作业。
需要“ sidekiq / api” Sidekiq :: ScheduledSet.new.find_job(jid).try(:delete) 另外,您的工作可以查看它在运行时是否仍然有用。
答案 2 :(得分:0)
好的,原来我已经回答了一个问题。我包含的代码集之一是Wiki中功能相似的版本。如果您还不是编程新手,那么另一个问题(“如何在模型中访问该jid?”的解决方案)看起来确实很明显,但基本上是:将jid存储在数据库列中,然后在任何时候检索/更新它这是需要的! h!