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

Posted

技术标签:

【中文标题】使用 Delayed::Job 时使用 ActiveJob 设置优先级【英文标题】:Setting priority with ActiveJob when using Delayed::Job 【发布时间】:2018-10-29 02:30:19 【问题描述】:

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

class GuestsCleanupJob < ApplicationJob
  queue_as :high_priority

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

【问题讨论】:

【参考方案1】:

定义一个定义优先级的实例方法是可行的,但是不允许我重载该值。 给定这个类

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

【讨论】:

或者,您可以使用文档中指示的set 来指定队列。 ` MyJob.set(queue: :another_queue).perform_later(record)` guides.rubyonrails.org/active_job_basics.html【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于使用 Delayed::Job 时使用 ActiveJob 设置优先级的主要内容,如果未能解决你的问题,请参考以下文章

你如何告诉一个特定的 Delayed::Job 在控制台中运行?

在Delayed_job中手动重试作业

如何查看延迟的作业队列?

使用片段清除回栈

在运行时使用自定义声明 Azure Active Directory

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are activ