Active Job – 稍后执行工作
Active Job 是一个用于声明作业并使它们在各种队列后端上运行的框架。这些作业可以是任何内容,从定期安排的清理到计费费用再到邮件发送,任何内容都可以切分成小单位的工作并并行运行。
它还充当 Action Mailer 的 deliver_later 功能的后端,该功能可以轻松地将任何邮件变成稍后运行的作业。这是现代 Web 应用程序中最常见的作业之一:在请求-响应周期之外发送电子邮件,以便用户不必等待它。
要点是确保所有 Rails 应用程序都具备作业基础设施,即使它以“立即运行程序”的形式出现。然后,我们可以在此基础上构建框架功能和其他 gem,而无需担心 Delayed Job 和 Resque 之间的 API 差异。因此,选择队列后端更多地成为一种操作问题。您将能够在它们之间切换,而无需重写作业。
您可以在 Active Job Basics 指南中阅读有关 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 文档。
请注意:我们不接受新适配器的拉取请求。我们鼓励库作者提供 ActiveJob
适配器作为其 gem 的一部分,或作为独立 gem。有关此问题的讨论,请参阅以下 PR:23311、21406 和 #32285。
下载和安装
Active Job 的最新版本可以通过 RubyGems 安装
$ gem install activejob
源代码可以作为 GitHub 上 Rails 项目的一部分下载
许可证
Active Job 在 MIT 许可下发布
支持
API 文档位于
Ruby on Rails 项目的错误报告可以提交到此处
功能请求应在此处 rails-core 邮件列表中讨论
- 模块 ActiveJob::Arguments
- 模块 ActiveJob::Callbacks
- 模块 ActiveJob::Core
- 模块 ActiveJob::Enqueuing
- 模块 ActiveJob::Exceptions
- 模块 ActiveJob::Execution
- 模块 ActiveJob::QueueAdapter
- 模块 ActiveJob::QueueAdapters
- 模块 ActiveJob::QueueName
- 模块 ActiveJob::QueuePriority
- 模块 ActiveJob::Serializers
- 模块 ActiveJob::TestHelper
- 模块 ActiveJob::VERSION
- 类 ActiveJob::Base
- 类 ActiveJob::DeserializationError
- 类 ActiveJob::EnqueueError
- 类 ActiveJob::SerializationError
- 类 ActiveJob::TestCase
- G
- P
- U
- V
类公共方法
gem_version() 链接
返回当前加载的 Active Job 版本,格式为 Gem::Version
。
perform_all_later(*jobs) 链接
一次性将多个作业推送到队列,而无需运行入队回调。队列适配器可以通过设置传入作业实例上的 successfully_enqueued 和/或 enqueue_error 来传达每个作业的入队状态。
# 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
unknown 链接
如果为 false,Rails 将保留 BigDecimal
作业参数作为字符串的旧序列化。如果为 true,Rails 将使用新的 BigDecimalSerializer 以无损方式(反)序列化 BigDecimal
。旧序列化将在 Rails 7.2 中删除,以及此配置。
来源:显示 | 在 GitHub 上
# File activejob/lib/active_job.rb, line 53 singleton_class.attr_accessor :use_big_decimal_serializer
version() 链接
返回当前加载的 Active Job 版本,格式为 Gem::Version
。
来源:显示 | 在 GitHub 上
# File activejob/lib/active_job/version.rb, line 7 def self.version gem_version end