Active Job – 稍後執行工作
Active Job 是用於宣告工作並讓它們在各種排隊後端上執行的架構。這些工作可以是從定期排定的清理、計費費用到郵寄等所有事項,也就是任何可以切成小工作單元並平行執行的內容。
它也作為 Action Mailer 的 deliver_later 功能的後端,讓任何郵件都容易轉換成稍後執行的工作。那是現代網路應用程式中最常見的工作之一:在請求回應循環之外傳送電子郵件,讓使用者不用等候。
重點是要確保所有 Rails 應用程式都具備作業基礎架構,即使是「立即執行器」的形式。然後我們可以建立架構功能和其他寶石,而不用擔心 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 文件。
請注意:我們不接受新的轉接器的拉取請求。我們鼓勵函式庫作者提供 ActiveJob
轉接器作為其寶石的一部分,或作為獨立的寶石。有關此討論,請參閱以下公關:23311、21406 和 #32285。
下載和安裝
可以使用 RubyGems 安裝最新版本的 Active Job
$ 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
。
來源: 顯示 | 在 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) 連結
一次將多個工作推送到佇列,而不執行佇列回呼。佇列適配器可能會透過設定傳入工作實例中的 successfully_enqueued 和/或 enqueue_error 來傳達每個工作的佇列狀態。
來源:顯示 | 在 GitHub 上
# 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