繁体   English   中英

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

[英]How to specify a default queue to use for all jobs with 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中,类变量不会被继承。 这就是为什么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

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

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

module ResqueJob
  def initQueue
    @queue = :app
  end 
end

class ChildJob 
  extend ResqueJob

  initQueue

  def self.perform
  end
end

Resque.enqueue(ChildJob)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM