繁体   English   中英

在Rails中取消了一个被拖延的Sidekiq工作

[英]cancelling a sheduled Sidekiq job in Rails

我的应用程序中的某些Sidekiq作业计划将资源状态更改为cancelled除非用户在特定时间范围内响应。 有一个大量 信息, 关于如何最好地完成这个任务,但没有它实际上取消作业。

要取消作业,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

然而, 这里建议我做类似的事情

 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

令人困惑的是,维基上的这个和类似代码实际上并没有取消这项工作。 如果cancelled? ,上面的例子只对thing进行更新cancelled? 返回false (应该如此),但是如果以后它返回true则不会取消。 它只是失败并带有aasm转换错误消息并被发送到RetrySet。 调用MyWorker.cancel! jid 模型代码中的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的功能类似的代码版本。 另一个问题的解决方案(“我如何访问模型中的jid?”)似乎非常明显,如果你还不是编程新手,但基本上:将jid存储在数据库列中,然后每当检索/更新它它需要! 咄!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM