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 中提供 Active Job 适配器,或作为独立 gem。
连续作业¶ ↑
连续作业允许作业被中断和恢复。有关更多信息,请参阅 ActiveJob::Continuation。
下载和安装¶ ↑
可以使用 RubyGems 安装最新版本的 Active Job
$ gem install activejob
源代码可以作为 Rails 项目的一部分在 GitHub 上下载。
许可证¶ ↑
Active Job 根据 MIT 许可发布
支持¶ ↑
API 文档位于:
Ruby on Rails 项目的错误报告可在此处提交:
功能请求应在此处的 rubyonrails-core 论坛上讨论: