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

Setting priority with ActiveJob when using Delayed::Job

使用 ActiveJob 入队作业时如何设置延迟作业的优先级?

class GuestsCleanupJob < ApplicationJob
  queue_as :high_priority

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

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

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

我已将它添加到我的初始化器中,如果有人遇到它,我只是想分享!

使用 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

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

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

要遵循 queue_as 的模式,您还可以使用 queue_with_priority,例如:

class GuestsCleanupJob < ApplicationJob
  queue_as :high_priority
  queue_with_priority 1

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


https://api.rubyonrails.org/classes/ActiveJob/QueuePriority/ClassMethods.html#method-i-queue_with_priority