6

Кто-нибудь мог получить запланированные задания для работы в Rails 4.2?Resque-Scheduler не работает с ActiveJob в Rails 4.2

Я использую resque, и я пытаюсь использовать resque-scheduler для планирования заданий. У меня есть график, который загружается, и планировщик работает, и даже выглядит, что он запускает задания, но он ничего не делает.

resque-scheduler: [INFO] 2014-09-16T01:54:25-07:00: Starting 
resque-scheduler: [INFO] 2014-09-16T01:54:25-07:00: Loading Schedule 
resque-scheduler: [INFO] 2014-09-16T01:54:25-07:00: Scheduling friends 
resque-scheduler: [INFO] 2014-09-16T01:54:25-07:00: Schedules Loaded 
resque-scheduler: [INFO] 2014-09-16T01:54:55-07:00: queueing FriendsJob (friends) 

Я могу заключить задания как это, и они обрабатываются.

TestJob.enqueue(params[:id]) 

и я получаю этот выход в журнале

got: (Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | ["TestJob", "98732ce5-17f7-4da3-9a03-a5d2f8f74e84", "8"]) 
** [01:24:01 2014-09-16] 54841: resque-1.25.2: Processing default since 1410855841 [ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper] 
** [01:24:01 2014-09-16] 54841: Running before_fork hooks with [(Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | ["TestJob", "98732ce5-17f7-4da3-9a03-a5d2f8f74e84", "8"])] 
** [01:24:01 2014-09-16] 54841: resque-1.25.2: Forked 54882 at 1410855841 
** [01:24:01 2014-09-16] 54882: Running after_fork hooks with [(Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | ["TestJob", "98732ce5-17f7-4da3-9a03-a5d2f8f74e84", "8"])] 
Hello World!! 
** [01:24:01 2014-09-16] 54882: done: (Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | ["TestJob", "98732ce5-17f7-4da3-9a03-a5d2f8f74e84", "8"]) 

работник Но когда я пытаюсь запланировать работу, похоже, получают Епдиеие, но они хорошо ничего не делать.

Вот schedule.yml

friends: 
    every: "30s" 
    queue: "friends" 
    class: "FriendsJob" 
    args: 8 
    description: "Friends jobs scheduler" 

Вот выход из запланированного задания.

** [01:23:36 2014-09-16] 54841: got: (Job{friends} | FriendsJob | [8]) 
** [01:23:36 2014-09-16] 54841: resque-1.25.2: Processing friends since 1410855816 [FriendsJob] 
** [01:23:36 2014-09-16] 54841: Running before_fork hooks with [(Job{friends} | FriendsJob | [8])] 
** [01:23:36 2014-09-16] 54841: resque-1.25.2: Forked 54880 at 1410855816 
** [01:23:36 2014-09-16] 54880: Running after_fork hooks with [(Job{friends} | FriendsJob | [8])] 
** [01:23:36 2014-09-16] 54880: done: (Job{friends} | FriendsJob | [8]) 

После прочтения этой http://dev.mikamai.com/post/96343027199/rails-4-2-new-gems-active-job-and-global-id я заподозрить, что что-то делать с ActiveJob и GlobalId.

Посмотрите на разницу помещён

** [01:24:01 2014-09-16] 54841: Running before_fork hooks with [(Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | ["TestJob", "98732ce5-17f7-4da3-9a03-a5d2f8f74e84", "8"])] 

против запланированного

** [01:23:36 2014-09-16] 54841: Running before_fork hooks with [(Job{friends} | FriendsJob | [8])] 

Задания сами сгенерированные с помощью

rails g job <JobName> 

Они выглядят так:

class TestJob < ActiveJob::Base 
    queue_as :default 
    def perform(friend_id) 
    friend = Friend.find(friend_id) 
    name = friend.name.swapcase 
    puts "Hello World!!" 
    end 
end 


class FriendsJob < ActiveJob::Base 
    queue_as :friends 
    def perform(friend_id) 
    friend = Friend.find(friend_id) 
    name = friend.name.swapcase 
    puts "Hello World!!" 
    end 
end 

Любая помощь с этим будет принята с благодарностью и заблаговременно.

********* ********* UPDATE

я удалил action_job railtie, и я использую Resque и Resque-планировщика только, и запланированные задания работают Теперь. Так что это похоже на ActionJob/GlobalId. Я открываю проблему в проекте rails. Надеюсь, они скоро это исправит.

****** ВТОРОЕ ОБНОВЛЕНИЕ ********* У меня есть обновление об этом. Об этом сказал Cristianbica, который работает в кодовой базе ActiveJob. «Мы пока не думали о повторяющихся работах, и мы не поддерживаем это, так как ни один из адаптеров не поддерживает это без внешнего драгоценного камня. Однако это очень приятная функция, но я не думаю, что мы можем сделать это вовремя для 4.2. Также я не уверен, что он будет включен в рельсы »

+0

Если кто интересуется вышеуказанной проблемой, проверьте это: https://github.com/rails/rails/issues/16933. – juanitofatas

+0

Я также хотел бы использовать activejob, но я сдерживаюсь, так как мне нужно иметь повторяющиеся задания, которые запускаются каждые 15 минут и каждые 1 минуту. – omencat

ответ

2

ОБНОВЛЕНИЕ: 4/4/16 - В то время как нижний ответ по-прежнему соответствует текущей версии Rails, теперь я использую массив active_scheduler созданный Джастином, как указано в ответе выше: https://stackoverflow.com/a/29155372/1299792

ОРИГИНАЛЬНЫЙ ОТВЕТ: Избегайте использования ActiveJob, если вам нужно назначить повторяющиеся задания.

От issue that Luis raised

Как мы в настоящее время не поддерживает повторяющиеся задания с ActiveJob мы собираемся закрыть это. Если можно поддерживать повторяющиеся задания, я вижу это как отдельный камень или рельсы. Запросы функций и разговоры вокруг них обычно обсуждаются в списке рассылки (https://groups.google.com/forum/#!forum/rubyonrails-core). Как решение вашей проблемы @luismadrigal, я предлагаю вам использовать метод resque-scheduler для выполнения повторяющейся работы.

https://github.com/rails/rails/issues/16933#issuecomment-58945932

Был разговор о создании жемчужины in the mailing list, но я не могу найти дополнительную информацию о нем.

4

https://github.com/JustinAiken/active_scheduler драгоценный камень, который оборачивает один в другой

+1

Это потенциально УДИВИТЕЛЬНО! Я собираюсь попробовать. Благодаря! –

+1

Большое спасибо за эту работу Джастин, она отлично работает. – trans1t

0

Это кажется, что ActiveJob в Rails 4.2 не поддерживается по Resque-планировщиком. Таким образом, задания не запланированы правильно, что объясняет разницу в журнале при запуске задания с использованием ActiveJob API и реск-планировщика.

Чтобы исправить это, мы должны найти способ планировать работу в течение ActiveJob обертке:

ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper 

Resque-планировщик обеспечивает способ поддержки расширений, которые не поддерживаются по умолчанию. Чтобы сделать это, мы должны расширить собственный класс заданий для поддержки метода #scheduled. Таким образом, мы можем вручную выполнить задание вручную с помощью API ActiveJob.

Самый простой способ, чтобы написать общий метод кода в базовой работе, а затем продлить все задания из него:

# custom base job 
class Job < ActiveJob::Base 

    # method called by resque-scheduler to enqueue job in a queue 
    def self.scheduled(queue, klass, *args) 

     # create the job instance and pass the arguments 
     job = self.job_or_instantiate(*args) 

     # set correct queue 
     job.queue_name = queue 

     # enqueue job using ActiveJob API 
     job.enqueue 
    end 
end 

Reque-планировщик будет вызывать этот метод планировать каждую работу простиралась от Job класса. Таким образом, задания будут помещены в оболочку ActiveJob. Результат будет таким же, как и вызов MyJob.perform_later(*args).

 Смежные вопросы

  • Нет связанных вопросов^_^