取消在Rails中停止的Sidekiq工作

时间:2018-12-10 20:04:40

标签: ruby-on-rails sidekiq aasm

我的应用程序中的某些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?实际上如何取消删除该特定工作?谢谢!

3 个答案:

答案 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!