使用Delayed :: Job时使用ActiveJob设置优先级

时间:2018-05-18 15:38:16

标签: ruby-on-rails delayed-job rails-activejob

使用ActiveJob将作业排入队列时,如何设置延迟作业优先级?

class GuestsCleanupJob < ApplicationJob
  queue_as :high_priority

  def perform(*guests)
    # Do something later
  end
end

3 个答案:

答案 0 :(得分:4)

我花了一段时间,但我在Delayed :: Job文档中找到了这个方法:

Delayed::Worker.queue_attributes = {
  default:       { priority: 11 },
  high_priority: { priority: 1 },
  low_priority:  { priority: 75 }
}

我已将此添加到我的初始化程序中,只是想分享是否有其他人遇到此问题!

答案 1 :(得分:2)

定义一个定义优先级的实例方法,但是不允许我重载该值。 鉴于此类

class GuestsCleanupJob < ApplicationJob
  queue_as :high_priority

  def priority
    1
  end

  def perform(*guests)
    # Do something later
  end
end

如果我运行

GuestsCleanupJob.set(priority: 55).perform_later(user, lead) # priority set to 1 not 55

它将优先级为1的作业排队,而忽略我通过的55。

那没有为我的用例提供足够的控制,所以我做了。

class GuestsCleanupJob < ApplicationJob
  queue_as :high_priority

  def default_priority
    1
  end

  def priority
    @priority || default_priority
  end

  def perform(*guests)
    # Do something later
  end
end

使用上面的代码,默认情况下,优先级将设置为1,但是我可以使用我的

GuestsCleanupJob.set(priority: 55).perform_later(user, lead) # priority set to 55

答案 2 :(得分:0)

使用Delayed :: Worker.queue_attributes的解决方案,看起来还可以,并且已经有文档记录,但是对我来说不起作用... 不管在queue_attributes中设置的队列优先级如何,所有作业的优先级均为0。 这对我有用:

class GuestsCleanupJob < ApplicationJob
  queue_as :high_priority

  def priority
    1
  end

  def perform(*guests)
    # Do something later
  end
end