【发布时间】:2010-12-16 15:12:40
【问题描述】:
我有一个带有插件 https://github.com/tobi/delayed_job 的 Rails 应用程序
有时执行作业的顺序与创建它们的顺序不同。
我希望作业按照创建时的顺序执行,因为在某些情况下要执行作业,前一个作业已成功执行很重要。
请帮忙。
问候, 潘卡伊
【问题讨论】:
标签: ruby-on-rails ruby delayed-job
我有一个带有插件 https://github.com/tobi/delayed_job 的 Rails 应用程序
有时执行作业的顺序与创建它们的顺序不同。
我希望作业按照创建时的顺序执行,因为在某些情况下要执行作业,前一个作业已成功执行很重要。
请帮忙。
问候, 潘卡伊
【问题讨论】:
标签: ruby-on-rails ruby delayed-job
如果不确切了解您是如何创建作业的,则很难判断,但除了 created_at 时间之外,影响执行顺序的唯一因素是为作业设置的优先级。我不知道您使用的 tobi 叉子和collectiveidea 叉子之间的区别,但这是来自collectiveidea 文档:
默认情况下,所有作业的调度优先级 = 0,这是最高优先级。您可以通过将 Delayed::Worker.default_priority 设置为其他值来更改此设置。较低的数字具有较高的优先级。
以及来自迁移:
table.integer :priority, :default => 0 # 允许某些作业跳到队列的最前面
您当然可以在创建作业时手动指定优先级。
【讨论】:
据我了解,失败的作业将被重新安排,以便稍后重试。
“失败时,作业会在 5 秒 + N ** 4 后再次调度,其中 N 是重试次数。”来自README.textile 的设置部分。
我假设剩余的作业将同时处理。您可能想要监控您的延迟作业表并查看是否有任何作业的 last_error 字段值设置为 NULL 以外的值。
这也可能取决于您有多少工作进程。 delay_job worker 将作业按顺序从delayed_jobs 表中取出,但不能保证worker 会按顺序完成任务。
【讨论】: