5

除非另有说明,否则我希望所有入队调用都默认为某个队列,因此它是干燥的并且更易于维护。为了指定一个队列,文档说要在类中定义一个变量@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
4

3 回答 3

11

在 ruby​​ 中,类变量不会被继承。这就是 Resque 找不到您的 @queue 变量的原因。

你应该self.queue在你的父类中定义。Resque 首先检查@queue 的存在,然后再寻找一个queue类方法:

class ResqueJob
  def self.queue; :app; end
end

class ChildJob < ResqueJob
  def self.perform; ...; end
end
于 2012-02-14T19:43:00.833 回答
4

如果你想用 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​​ 方法来做,但我觉得这种方法更容易,所以值得重量;))

于 2012-10-03T15:04:57.097 回答
0

尝试混合。像这样的东西:

module ResqueJob
  def initQueue
    @queue = :app
  end 
end

class ChildJob 
  extend ResqueJob

  initQueue

  def self.perform
  end
end

Resque.enqueue(ChildJob)
于 2011-02-26T03:38:06.180 回答