我希望所有的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
答案 0 :(得分: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
答案 1 :(得分: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
(如果你没有主动支持,你也可以用经典的红宝石方式做到这一点,但我发现这种方式更容易,非常值得体重;)
答案 2 :(得分:0)
试试mixin。像这样:
module ResqueJob
def initQueue
@queue = :app
end
end
class ChildJob
extend ResqueJob
initQueue
def self.perform
end
end
Resque.enqueue(ChildJob)