在 Rails 中取消一个临时的 Sidekiq 工作

cal*_*eld 5 ruby-on-rails aasm sidekiq

我的应用程序中的某些 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
Run Code Online (Sandbox Code Playgroud)

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

 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
Run Code Online (Sandbox Code Playgroud)

维基上的这个和类似代码令人困惑的是,它实际上没有取消工作。上面的示例只是对thingifcancelled?返回false(应该如此)执行更新,但不会取消如果将来返回 true 以及何时返回。它只是失败并显示 aasm 转换错误消息并被发送到 RetrySet。调用MyWorker.cancel! jid模型代码会引发未定义的变量错误。如何在模型中访问该 jid?如何实际取消删除该特定作业?谢谢!

Mik*_*ham 6

# 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)
Run Code Online (Sandbox Code Playgroud)

  • 是的,`cancel!` 是根据一些用户操作/事件调用的。您的用户付款操作会调用它来取消相应的作业,因此当作业运行时,它会立即返回并且实际上什么都不做。 (2认同)

cal*_*eld 0

好吧,原来我已经回答了一个问题。我包含的代码集之一是来自 wiki 的代码的功能相似版本。如果您对编程还不是新手,那么另一个问题(“如何访问模型中的 jid?”)的解决方案似乎非常明显,但基本上是:将 jid 存储在数据库列中,然后在任何时候检索/更新它这是需要的!呃!