модуль 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 в вашу задачу вместо пар «класс/id», которые затем нужно вручную десериализовать. Раньше задачи выглядели так:
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.
Обратите внимание: Мы не принимаем запросы на добавление новых адаптеров. Мы рекомендуем авторам библиотек предоставлять адаптер ActiveJob в качестве части их драгоценного камня или как самостоятельный драгоценный камень. Обсуждение этого можно найти в следующих PR: 23311, 21406 и #32285.
Загрузка и установка
Последнюю версию Active Job можно установить с помощью RubyGems:
$ gem install activejob
Исходный код можно загрузить в рамках проекта Rails на GitHub:
Лицензия
Active Job распространяется по лицензии MIT:
Поддержка
API-документация находится по адресу:
Сообщения об ошибках для проекта Ruby on Rails можно отправлять сюда:
Запросы на новые функции следует обсуждать на почтовом списке rails-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 Добавить сразу много задач в очередь без запуска обратных вызовов enqueue. Адаптеры очереди могут сообщать об успешном добавлении каждой задачи, установив успешно_enqueued и/или enqueue_error для переданных экземпляров задач.
# File activejob/lib/active_job.rb, line 52
def self.use_big_decimal_serializer
ActiveJob.deprecator.warn <<-WARNING.squish
Rails.application.config.active_job.use_big_decimal_serializer is deprecated and will be removed in Rails 8.0.
WARNING
end # File activejob/lib/active_job.rb, line 58
def self.use_big_decimal_serializer=(value)
ActiveJob.deprecator.warn <<-WARNING.squish
Rails.application.config.active_job.use_big_decimal_serializer is deprecated and will be removed in Rails 8.0.
WARNING
end # File activejob/lib/active_job.rb, line 69 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.