销毁 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 的延迟作业。destroy
和delete
有区别吗?
destroy
将处理 Rails 定义的任何回调 - 特别是,它将清除您设置了 dependent: destroy
或 depdendent: nullify
的任何关联。 delete
只是从数据库中删除记录。一般来说,除非您有充分的理由,否则请始终使用 destroy
而不是 delete
。
另外,Delayed::Job.find(id).locked_by 会在显示的字符串中为您提供一个 PID,例如:“host:Your-Host.local pid:6899”以上是关于销毁 Rails 中所有延迟的工作的主要内容,如果未能解决你的问题,请参考以下文章
Rails - 在before_destroy回调时取消销毁
如何正确销毁 ruby on rails 中的关联记录?