在 Rails 中取消计划的 Sidekiq 作业
cancelling a sheduled Sidekiq job in Rails
我的应用程序中的某些 Sidekiq 作业计划将资源状态更改为 cancelled
,除非用户在特定时间范围内做出响应。有 lot of information about 如何最好地完成此任务,但 none 实际上取消了作业。
要取消作业,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 上的类似代码令人困惑的是 none 它实际上取消了作业。上面的示例只是在 thing
if cancelled?
returns false
上执行更新(应该如此),但如果 returns 为真则不会取消在将来。它只是失败并显示 aasm 转换错误消息并被发送到 RetrySet。在模型代码中调用 MyWorker.cancel! jid
会引发未定义变量错误。如何在模型中访问该 jid?实际上如何 取消 或 删除 该特定作业?谢谢!
# 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)
您可以这样做,但效率不高。这是通过 JID 查找预定作业的线性扫描。
需要'sidekiq/api'
Sidekiq::ScheduledSet.new.find_job(jid).try(:delete)
或者,您的作业可以查看它在运行时是否仍然相关。
好的,原来我已经回答了一个问题。我包含的代码集之一是来自 wiki 的代码的功能相似版本。如果您还不是编程新手,那么另一个问题 ("how can I access that jid in the model?") 的解决方案似乎非常明显,但基本上:将 jid 存储在数据库列中,然后在需要时 retrieve/update 它!呸!
我的应用程序中的某些 Sidekiq 作业计划将资源状态更改为 cancelled
,除非用户在特定时间范围内做出响应。有 lot of information about 如何最好地完成此任务,但 none 实际上取消了作业。
要取消作业,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 上的类似代码令人困惑的是 none 它实际上取消了作业。上面的示例只是在 thing
if cancelled?
returns false
上执行更新(应该如此),但如果 returns 为真则不会取消在将来。它只是失败并显示 aasm 转换错误消息并被发送到 RetrySet。在模型代码中调用 MyWorker.cancel! jid
会引发未定义变量错误。如何在模型中访问该 jid?实际上如何 取消 或 删除 该特定作业?谢谢!
# 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)
您可以这样做,但效率不高。这是通过 JID 查找预定作业的线性扫描。
需要'sidekiq/api' Sidekiq::ScheduledSet.new.find_job(jid).try(:delete) 或者,您的作业可以查看它在运行时是否仍然相关。
好的,原来我已经回答了一个问题。我包含的代码集之一是来自 wiki 的代码的功能相似版本。如果您还不是编程新手,那么另一个问题 ("how can I access that jid in the model?") 的解决方案似乎非常明显,但基本上:将 jid 存储在数据库列中,然后在需要时 retrieve/update 它!呸!