5

特に指定がない限り、すべてのエンキュー呼び出しをデフォルトで特定のキューに設定して、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
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

ミックスインでこれを行いたい場合は、次のようにできます。

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 に答える