модуль ActiveJob
Active Job — выполнение задач в фоновом режиме
Active Job — это фреймворк для объявления задач и их выполнения с помощью различных систем очередей. Это могут быть самые разные задачи: от регулярной очистки данных и списания платежей до рассылок — любые задачи, которые можно разбить на небольшие единицы работы и выполнять параллельно.
Он также служит серверной частью для функции deliver_later в Action Mailer, которая позволяет легко превратить любую рассылку в задачу для отложенного выполнения. Это одна из самых распространённых задач в современном веб-приложении: отправка электронных писем вне цикла запрос-ответ, чтобы пользователю не приходилось ждать.
Главная цель — обеспечить все приложения Rails инфраструктурой для выполнения задач, даже если это будет «немедленный исполнитель». Тогда функции фреймворка и другие гемы смогут использовать эту инфраструктуру, не беспокоясь о различиях API между Delayed Job и Resque. Выбор системы очередей станет скорее эксплуатационной задачей. Кроме того, вы сможете переключаться между ними без необходимости переписывать задачи.
Подробнее об Active Job можно прочитать в руководстве Основы Active Job.
Использование
Чтобы узнать, как использовать предпочитаемую вами систему очередей, ознакомьтесь с документацией её адаптера в разделе ActiveJob::QueueAdapters.
Объявите задачу следующим образом:
class MyJob < ActiveJob::Base
queue_as :my_jobs
def perform(record)
record.do_work
end
end
Добавьте задачу в очередь следующим образом:
MyJob.perform_later record # Enqueue a job to be performed as soon as the queuing system is free.
MyJob.set(wait_until: Date.tomorrow.noon).perform_later(record) # Enqueue a job to be performed tomorrow at noon.
MyJob.set(wait: 1.week).perform_later(record) # Enqueue a job to be performed 1 week from now.
Вот и всё!
Поддержка GlobalID
Active Job поддерживает сериализацию GlobalID параметров. Это позволяет передавать в задачу активные объекты Active Record вместо пар класс/идентификатор, которые раньше приходилось десериализовывать вручную. Раньше задачи выглядели так:
class TrashableCleanupJob
def perform(trashable_class, trashable_id, depth)
trashable = trashable_class.constantize.find(trashable_id)
trashable.cleanup(depth)
end
end
Теперь можно просто написать:
class TrashableCleanupJob
def perform(trashable, depth)
trashable.cleanup(depth)
end
end
Это работает с любым классом, в который включён модуль GlobalID::Identification. По умолчанию он включён в классы Active Record.
Поддерживаемые системы очередей
В Active Job есть встроенные адаптеры для нескольких систем очередей (Sidekiq, Resque, Delayed Job и других). Актуальный список адаптеров можно найти в документации API для ActiveJob::QueueAdapters.
Обратите внимание: мы не принимаем запросы на слияние с новыми адаптерами и активно выносим существующие адаптеры в отдельные проекты. Мы рекомендуем авторам библиотек добавлять адаптер Active Job в состав своего гема или выпускать его как отдельный гем.
Продолжения
Продолжения позволяют прерывать задачи и возобновлять их выполнение. Подробнее см. в разделе ActiveJob::Continuation.
Загрузка и установка
Последнюю версию Active Job можно установить с помощью RubyGems:
$ gem install activejob
Исходный код можно скачать в составе проекта Rails на GitHub:
Лицензия
Active Job распространяется по лицензии MIT:
Поддержка
Документация API находится по адресу:
Сообщить об ошибках в проекте Ruby on Rails можно здесь:
Предложения по новым функциям следует обсуждать на форуме rubyonrails-core:
Открытые методы класса
# File activejob/lib/active_job/gem_version.rb, line 5 def self.gem_version Gem::Version.new VERSION::STRING end
Возвращает текущую загруженную версию Active Job в виде Gem::Version.
# File activejob/lib/active_job/enqueuing.rb, line 14
def perform_all_later(*jobs)
jobs.flatten!
jobs.group_by(&:queue_adapter).each do |queue_adapter, adapter_jobs|
instrument_enqueue_all(queue_adapter, adapter_jobs) do
if queue_adapter.respond_to?(:enqueue_all)
queue_adapter.enqueue_all(adapter_jobs)
else
adapter_jobs.each do |job|
job.successfully_enqueued = false
if job.scheduled_at
queue_adapter.enqueue_at(job, job.scheduled_at.to_f)
else
queue_adapter.enqueue(job)
end
job.successfully_enqueued = true
rescue EnqueueError => e
job.enqueue_error = e
end
adapter_jobs.count(&:successfully_enqueued?)
end
end
end
nil
end Добавляет в очередь сразу несколько задач, не запуская обратные вызовы постановки в очередь. Адаптеры очередей могут сообщать о статусе постановки каждой задачи, устанавливая атрибуты successfully_enqueued и/или enqueue_error у переданных экземпляров задач.
# File activejob/lib/active_job.rb, line 60 singleton_class.attr_accessor :verbose_enqueue_logs
Указывает, следует ли записывать в журнал методы, вызывающие постановку фоновых задач в очередь, под соответствующими строками журнала постановки в очередь. По умолчанию значение равно false.
# File activejob/lib/active_job/version.rb, line 7 def self.version gem_version end
Возвращает текущую загруженную версию Active Job в виде Gem::Version.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.