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 文档。
请注意:我们不接受新适配器的 pull 请求,并且我们正在积极提取现有适配器。我们鼓励库作者提供一个 Active Job 适配器作为其 gem 的一部分,或者作为一个独立的 gem。
Continuations¶ ↑
Continuations 允许作业被中断和恢复。更多信息请参阅 ActiveJob::Continuation。
下载和安装¶ ↑
可以使用 RubyGems 安装最新版本的 Active Job
$ gem install activejob
源代码可以作为 Rails 项目的一部分在 GitHub 上下载。
许可证¶ ↑
Active Job 在 MIT 许可下发布
支持¶ ↑
API 文档位于:
Ruby on Rails 项目的错误报告可在此处提交:
功能请求应在此处的 rubyonrails-core 论坛上讨论:
- 模块 ActiveJob::Arguments
- 模块 ActiveJob::Callbacks
- 模块 ActiveJob::Continuable
- 模块 ActiveJob::Core
- 模块 ActiveJob::Enqueuing
- 模块 ActiveJob::Exceptions
- 模块 ActiveJob::Execution
- 模块 ActiveJob::Logging
- 模块 ActiveJob::QueueAdapter
- 模块 ActiveJob::QueueAdapters
- 模块 ActiveJob::QueueName
- 模块 ActiveJob::QueuePriority
- 模块 ActiveJob::Serializers
- 模块 ActiveJob::TestHelper
- 模块 ActiveJob::VERSION
- 类 ActiveJob::Base
- 类 ActiveJob::Continuation
- 类 ActiveJob::DeserializationError
- 类 ActiveJob::EnqueueError
- 类 ActiveJob::SerializationError
- 类 ActiveJob::TestCase
- 类 ActiveJob::UnknownJobClassError
类公共方法
gem_version() 链接
返回当前加载的 Active Job 版本,类型为 Gem::Version。
Source: 显示 | 在 GitHub 上
# File activejob/lib/active_job/gem_version.rb, line 5 def self.gem_version Gem::Version.new VERSION::STRING end
perform_all_later(*jobs) 链接
一次性将多个作业推送到队列,而无需运行 enqueuing 回调。队列适配器可以通过为传入的作业实例设置 successfully_enqueued 和/或 enqueue_error 来传达每个作业的 enqueuing 状态。
Source: 显示 | 在 GitHub 上
# 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
verbose_enqueue_logs 链接
指定调用后台作业 enqueuing 方法的日志是否应记录在其相关的 enqueuing 日志行下方。默认为 false。
Source: 显示 | 在 GitHub 上
# File activejob/lib/active_job.rb, line 60 singleton_class.attr_accessor :verbose_enqueue_logs
version() 链接
返回当前加载的 Active Job 版本,类型为 Gem::Version。
Source: 显示 | 在 GitHub 上
# File activejob/lib/active_job/version.rb, line 7 def self.version gem_version end