Как указать очередь по умолчанию для использования для всех заданий с Resque в Rails? - PullRequest
5 голосов
/ 24 февраля 2011

Я хочу, чтобы все вызовы в очередь по умолчанию передавались в определенную очередь, если не указано иное, поэтому это СУХОЙ и проще в обслуживании. Чтобы указать очередь, в документации сказано определить переменную @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

Ответы [ 3 ]

11 голосов
/ 14 февраля 2012

В ruby ​​переменные класса не наследуются. Вот почему Resque не может найти вашу переменную @queue.

Вместо этого вы должны определить self.queue в родительском классе. Resque сначала проверяет наличие @queue, но затем ищет метод класса queue:

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

class ChildJob < ResqueJob
  def self.perform; ...; end
end
4 голосов
/ 03 октября 2012

Если вы хотите сделать это с миксином, вы можете сделать это следующим образом:

module ResqueJob
  extend ActiveSupport::Concern

  module ClassMethods
    def queue
      @queue || :interactor_operations
    end
  end
end

class ChildJob
  include ResqueJob

  def self.perfom
  end
end

(если у вас нет активной поддержки, вы также можете сделать это классическим рубиновым способом, но янайти этот путь проще, так что стоит вес;))

0 голосов
/ 26 февраля 2011

Попробуйте миксин.Как то так:

module ResqueJob
  def initQueue
    @queue = :app
  end 
end

class ChildJob 
  extend ResqueJob

  initQueue

  def self.perform
  end
end

Resque.enqueue(ChildJob)
...