摧毁Rails中所有延迟作业

40

我正在使用适用于Rails 2.3.8的collectiveidea。我正在创建一组延迟任务数组来执行某些任务,一段时间后我想销毁正在运行的所有延迟任务。如果有人知道如何做到这一点,请帮助我。

3个回答

72

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


4
这并不是 OP 所要求的。他想要终止正在运行的作业,而不是清空队列。 - volx757
我有一个正在运行的作业(它将挂起两个小时),在运行 rake jobs:clear 后,工作进程也停止了该特定作业。 - morhook
原帖想知道如何从应用程序端而非终端中删除队列中的作业,因此这确实没有回答他/她的问题。从点赞数来看,人们似乎更关注后者。 - Tasos Anesiadis

59

除了rake任务外,DelayedJob作业只是普通的ActiveRecord模型,因此如果您在Ruby代码中,可以对它们进行任何操作:

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

请问您能否详细说明 Delayed::Job.find(4).destroy 的含义? - Rahul Tapali
1
@clickit 销毁延迟作业,其ID为4。 - lulalala
1
“destroy”和“delete”之间有区别吗? - Ian Vaughan
4
destroy 会处理 Rails 定义的任何回调函数,特别是它将清理掉任何你设置了 dependent: destroydependent: nullify 的关联。delete 只是从数据库中删除记录。一般来说,除非你有充分的理由,否则请始终使用 destroy 而不是 delete - Ryan Brunner
1
此外,Delayed::Job.find(id).locked_by 会在显示的字符串中给您提供一个 PID,例如:"host:Your-Host.local pid:6899"。 - volx757
有一堆有趣的方法/属性,handler 用于处理工作和工作参数的类的 yaml,last_error 用于最后一个错误的堆栈跟踪等。 job.attributes 将给出存储在数据库中的内容。此外,您可以使用 invoke_job 运行作业,但它不会删除它。 - localhostdotdev

0

看起来您有一个父进程,如果其任务集在一定时间内没有完成,它会超时。不要保留对任务本身的引用,而是在模型上设置一个指示进程已放弃的标志。如果任务不再需要,则可以检查该标志并进行短路处理。(您的 Job 类还应将其 #perform 方法的内容包装在一个超时中。)

尝试保留对 DJ 对象的引用几乎总是一个坏主意,就像您所建议的那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接