Spec-Zone.ru › Ruby on Rails 7.1

модуль ActiveJob

Active Job – Запускайте задачи позже

Active Job — это фреймворк для объявления задач и их запуска на различных backend-системах очередей. Эти задачи могут быть чем угодно, от регулярно планируемых очисток до выставления счетов и отправки почты — всё, что можно разбить на мелкие единицы работы и запускать параллельно.

Он также служит backend'ом для функциональности `deliver_later` Action Mailer, которая позволяет легко превращать любую рассылку в задачу для запуска позже. Это одна из самых распространённых задач в современной веб-приложении: отправка электронных писем вне цикла запросов-ответов, чтобы пользователь не ждал.

Главный момент заключается в том, чтобы гарантировать, что все приложения Rails будут иметь инфраструктуру задач, даже если она будет в виде «немедленного исполнителя». Затем мы можем иметь функциональные возможности фреймворка и другие gem'ы, построенные поверх этого, без необходимости беспокоиться о различиях API между Delayed Job и Resque. Выбор backend-системы очереди становится скорее вопросом эксплуатации. И вы сможете переключаться между ними, не переписывая свои задачи.

Дополнительную информацию об Active Job можно найти в руководстве Основные принципы работы с Active Job.

Использование

Чтобы узнать, как использовать предпочитаемую backend-систему очереди, см. документацию её адаптера в 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 имеет встроенные адаптеры для нескольких backend-систем очередей (Sidekiq, Resque, Delayed Job и другие). Чтобы получить актуальный список адаптеров, см. документацию API для ActiveJob::QueueAdapters.

Обратите внимание: Мы не принимаем pull-запросы для новых адаптеров. Мы рекомендуем авторам библиотек предоставлять адаптер ActiveJob в качестве части своего gem'а или в качестве автономного gem'а. Обсуждение этого вопроса можно найти в следующих PR: 23311, 21406 и #32285.

Загрузка и установка

Последнюю версию Active Job можно установить с помощью RubyGems:

$ gem install activejob

Исходный код можно загрузить как часть проекта Rails на GitHub:

  • github.com/rails/rails/tree/main/activejob

Лицензия

Active Job распространяется по лицензии MIT:

  • opensource.org/licenses/MIT

Поддержка

Документация API находится по адресу:

  • api.rubyonrails.org

Отчёты об ошибках для проекта Ruby on Rails можно подать здесь:

  • github.com/rails/rails/issues

Запросы на новые функции следует обсуждать на почтовой рассылке rails-core здесь:

  • discuss.rubyonrails.org/c/rubyonrails-core

Публичные методы класса

gem_version() Показать исходный код
# File activejob/lib/active_job/gem_version.rb, line 5
def self.gem_version
  Gem::Version.new VERSION::STRING
end

Возвращает текущую загруженную версию Active Job в виде Gem::Version.

perform_all_later(*jobs) Показать исходный код
# File activejob/lib/active_job/enqueuing.rb, line 16
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_time.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`. Адаптеры очереди могут передавать статус успешного добавления каждой задачи, устанавливая значения `successfully_enqueued` и/или `enqueue_error` на переданных экземплярах задач.

unknown() Показать исходный код
# File activejob/lib/active_job.rb, line 53
singleton_class.attr_accessor :use_big_decimal_serializer

Если false, Rails сохранит старую сериализацию аргументов задачи BigDecimal как строк. Если true, Rails будет использовать новый BigDecimalSerializer для (де)сериализации BigDecimal без потерь. Старая сериализация будет удалена в Rails 7.2 вместе с этой конфигурацией.

version() Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API