跳至内容 跳至搜索

Active Job – 让工作稍后完成

Active Job 是一个用于声明作业并在各种排队后端上运行作业的框架。这些作业可以是定期安排的清理、计费费用、邮件发送等等——任何可以分解成小工作单元并并行运行的作业。

它还充当 Action Mailer 的 deliver_later 功能的后端,使轻松将任何邮件转换为稍后运行的作业变得容易。这是现代 Web 应用程序中最常见的作业之一:在请求-响应周期之外发送电子邮件,以便用户不必等待它。

重点是确保所有 Rails 应用程序都将拥有作业基础设施,即使是“立即运行器”的形式。然后,我们可以拥有框架功能和其他 gem 建立在它之上,而无需担心 Delayed Job 和 Resque 之间的 API 差异。选择您的排队后端将成为更多操作上的问题。并且您将能够在它们之间切换,而无需重写您的作业。

您可以在 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 等)内置了适配器。要获取适配器的最新列表,请查看 ActiveJob::QueueAdapters 的 API 文档。

请注意: 我们不接受针对新适配器的拉取请求。我们鼓励库作者在其 gem 或作为独立 gem 中提供 ActiveJob 适配器。有关这方面的讨论,请参见以下 PR:2331121406#32285

下载和安装

可以使用 RubyGems 安装 Active Job 的最新版本

$ gem install activejob

源代码可以作为 GitHub 上的 Rails 项目的一部分下载

许可证

Active Job 在 MIT 许可证下发布

支持

API 文档位于

Ruby on Rails 项目的错误报告可以在这里提交

功能请求应在以下位置的 rails-core 邮件列表中进行讨论