2013-08-09 1 views
2

я использовал Resque-планировщик для заданий задержки в предыдущем коде:спасательного-статус и спасательный-планировщик для запаздывающих заданий

Resque.enqueue_in(options[:delay].seconds, self, context) 

Теперь я хочу, чтобы включить Resque-статус, чтобы сделать работу, но не имею ни малейшего представления о том, как они могут работать вместе. Последний источник спасательное-код состояния поддерживает планировщик, как и в исходном коде:

https://github.com/quirkey/resque-status/blob/master/lib/resque/plugins/status.rb

# Wrapper API to forward a Resque::Job creation API call into a Resque::Plugins::Status call. 
# This is needed to be used with resque scheduler 
# http://github.com/bvandenbos/resque-scheduler 
def scheduled(queue, klass, *args) 
    self.enqueue_to(queue, self, *args) 
end 

конец

Но я не знаю, как его использовать. Должен ли я просто вызвать SampleJob.scheduled (queue, myclass,: delay => delay) вместо SampleJob.create (options)?

=================================================================================================================================================== ========================

Кроме того, есть поддержка Resque-статус (и другие пользовательские рабочие места):

https://github.com/bvandenbos/resque-scheduler

Некоторые Resque-расширения, такие как resque-status, используют специальные классы заданий со слегка отличающейся подписью API. Resque-scheduler не пытается поддерживать все существующие и будущие классы пользовательских заданий, вместо этого он поддерживает флаг расписания, поэтому вы можете расширить свой собственный класс и обеспечить поддержку запланированного задания.

Давайте представим, что у нас есть класс JobWithStatus под названием FakeLeaderboard

class FakeLeaderboard < Resque::JobWithStatus 
    def perform 
    # do something and keep track of the status 
    end 
end 

, а затем расписание:

create_fake_leaderboards: 
    cron: "30 6 * * 1" 
    queue: scoring 
    custom_job_class: FakeLeaderboard 
    args: 
    rails_env: demo 
    description: "This job will auto-create leaderboards for our online demo and the status will update as the worker makes progress" 

Но это только кажется, для повторяющихся заданий. Я могу найти параметры cron, но не задержка. Итак, как я могу обрабатывать задержанные задания?

Спасибо!

ответ

0

У меня была такая же проблема, и я решил сам, внедряя модуль, который предоставляет бегун для «статусных» заданий.

module Resque # :nodoc: 

    # Module to include in your worker class to get resque-status 
    # and resque-scheduler integration 
    module ScheduledJobWithStatus 

    extend ActiveSupport::Concern 

    included do 
     # Include status functionalities 
     include Resque::Plugins::Status 
    end 

    # :nodoc: 
    module ClassMethods 

     # This method will use a custom worker class to enqueue jobs 
     # with resque-scheduler plugin with status support 
     def enqueue_at(timestamp, *args) 
     class_name = self.to_s # store class name since plain class object are not "serializable" 
     Resque.enqueue_at(timestamp, JobWithStatusRunner, class_name, *args) 
     end 

     # Identical to enqueue_at but takes number_of_seconds_from_now 
     # instead of a timestamp. 
     def enqueue_in(number_of_seconds_from_now, *args) 
     enqueue_at(Time.now + number_of_seconds_from_now, *args) 
     end 

    end 
    end 

    # Wrapper worker for enqueuing 
    class JobWithStatusRunner 
    # default queue for scheduling jobs with status 
    @queue = :delayed 

    # Receive jobs from {Resque::ScheduledJobWithStatus} queue them in Resque 
    # with support for status informations 
    def self.perform(status_klass, *args) 
     # Retrieve original worker class 
     klass = status_klass.to_s.constantize 
     # Check if supports status jobs 
     unless klass.included_modules.include? Resque::Plugins::Status 
     Rails.logger.warn("Class #{klass} doesn't support jobs with status") 
     return false 
     end 
     Rails.logger.debug("Enqueing jobs #{klass} with arguments #{args}") 
     klass.create(*args) 
    rescue NameError 
     Rails.logger.error("Unable to enqueue jobs for class #{status_klass} with args #{args}") 
     false 
    end 
    end 

end 

Таким образом, вы можете поставить в очередь заданий с этим простым синтаксисом:

# simple worker class 
class SleepJob 

    # This provides integrations with both resque-status and resque-scheduler 
    include Resque::ScheduledJobWithStatus 

    # Method triggered by resque 
    def perform 
    total = (options['length'] || 60).to_i 
    1.upto(total) { |i| at(i, total, "At #{i} of #{total}"); sleep(1) } 
    end 

end 

# run the job delayed 
SleepJob.enqueue_in(5.minutes) 
# or 
SleepJob.enqueue_at(5.minutes.from_now) 

Просто поместите модуль в Resque инициализаторе или в lib папке. В последнем случае не забудьте это где-нибудь.

0

resque-scheduler будет называть метод scheduled по предоставленному классу всякий раз, когда он создает работу для ваших работников. Он также прекрасно передает как имя очереди, так и имя класса в виде строки, поэтому вы можете создать метод уровня класса для обработки запланированных заданий.

Хотя ответ Фабио решит проблему, он немного переработан, чтобы ответить на ваш конкретный вопрос. Предполагая, что у вас есть JobWithStatus класс, что все ваши resque-status работников наследовать, вам нужно только добавить метод scheduled к нему для того, чтобы работать с resque-scheduler, как так:

class JobWithStatus 
    include Resque::Plugins::Status 

    def self.scheduled(queue, klass, *args) 
    Resque.constantize(klass).create(*args) 
    end 
end 
+0

Как вы указать дату/время что вы хотите, чтобы Resque выполнил задание? –

+0

@DonCote использует методы 'enqueue_at' или' enqueue_in' 'resque-scheduler'. Они берут ваш класс работы как второй аргумент, а любые данные - как третий. Например: 'Resque.enqueue_at (5.minutes.from_now, JobWithStatus, {foo: 'bar'})' –