如何指定一个默认队列用于所有具有Resque in Rails的作业?

我希望所有的enqueue调用都默认为某个队列,除非另有说明,所以它是DRY并且更容易维护。 为了指定队列,文档说在类中定义变量@queue = X. 所以,我尝试做以下事情并没有用,有什么想法吗?

class ResqueJob class << self; attr_accessor :queue end @queue = :app end class ChildJob < ResqueJob def self.perform end end Resque.enqueue(ChildJob) Resque::NoQueueError: Jobs must be placed onto a queue. from /Library/Ruby/Gems/1.8/gems/resque-1.10.0/lib/resque/job.rb:44:in `create' from /Library/Ruby/Gems/1.8/gems/resque-1.10.0/lib/resque.rb:206:in `enqueue' from (irb):5 

在ruby中,类变量不会被inheritance。 这就是为什么Resque找不到你的@queue变量。

您应该在父类中定义self.queue 。 Resque首先检查是否存在@queue,但其次是查找queue类方法:

 class ResqueJob def self.queue; :app; end end class ChildJob < ResqueJob def self.perform; ...; end end 

如果你想用mixin做这个,你可以这样做:

 module ResqueJob extend ActiveSupport::Concern module ClassMethods def queue @queue || :interactor_operations end end end class ChildJob include ResqueJob def self.perfom end end 

(如果你没有主动支持,你也可以用经典的ruby方式做到这一点,但我发现这种方式更容易,非常值得体重;))

尝试一下mixin。 像这样的东西:

 module ResqueJob def initQueue @queue = :app end end class ChildJob extend ResqueJob initQueue def self.perform end end Resque.enqueue(ChildJob)