销毁 Rails 中所有延迟的工作

Posted

技术标签:

【中文标题】销毁 Rails 中所有延迟的工作【英文标题】:Destroying all delayed job in rails 【发布时间】:2012-03-29 19:06:03 【问题描述】:

我正在为 rails 2.3.8 使用collectiveidea。我正在创建一系列延迟的工作 执行一些任务,一段时间后我想销毁所有正在运行的延迟作业。 如果有人知道如何做到这一点,请帮助我。

【问题讨论】:

【参考方案1】:

您可以调用rake jobs:clear 删除队列中的所有作业。

【讨论】:

这不符合 OP 的要求。他试图杀死正在运行的作业,而不是清除队列。 我有一个正在运行的工作(它将挂起两个小时),在运行 rake jobs:clear 之后,工作人员也停止了该特定工作。 OP 想知道如何从应用程序端(而不是终端)从队列中删除作业,所以这确实不能回答他/她的问题。不过,从赞成票看来,人们正在为后者提出这个问题。【参考方案2】:

听起来您有一个父进程,如果其作业集未在特定时间内完成,则该进程希望超时。与其挂在作业本身的引用上,不如在模型上设置一个标志,表明该过程已放弃。如果不再需要,作业可以检查该标志和短路。 (您的 Job 类还应该在超时中包装其 #perform 方法的内容。)

按照您的建议,尝试坚持对 DJ 对象的引用几乎总是一个坏主意。

【讨论】:

【参考方案3】:

除了 rake 任务,DelayedJob 作业只是一个普通的 ActiveRecord 模型,所以如果您使用 Ruby 代码,您可以对它们做您喜欢的事情:

Delayed::Job.destroy_all
Delayed::Job.delete_all
Delayed::Job.find(4).destroy
# etc.

【讨论】:

你能详细说明Delayed::Job.find(4).destroy @clickit 它会破坏 ID 为 4 的延迟作业。 destroydelete有区别吗? destroy 将处理 Rails 定义的任何回调 - 特别是,它将清除您设置了 dependent: destroydepdendent: nullify 的任何关联。 delete 只是从数据库中删除记录。一般来说,除非您有充分的理由,否则请始终使用 destroy 而不是 delete 另外,Delayed::Job.find(id).locked_by 会在显示的字符串中为您提供一个 PID,例如:“host:Your-Host.local pid:6899”

以上是关于销毁 Rails 中所有延迟的工作的主要内容,如果未能解决你的问题,请参考以下文章

Rails 销毁所有嵌套关联

Rails - 在before_destroy回调时取消销毁

如何正确销毁 ruby​​ on rails 中的关联记录?

如何清空/销毁 Rails 中的会话?

无法在 Rails 中使用 Devise 销毁会话 [重复]

Rails 控制台冻结手动删除/销毁操作