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 文件。
請注意:我們不接受新增轉接器的 pull request。我們鼓勵函式庫作者提供 ActiveJob
轉接器作為其 gem 的一部分,或作為獨立的 gem。如需討論此事,請參閱以下 PR:23311、21406 和 #32285。
下載與安裝
最新版本的 Active Job 可使用 RubyGems 安裝
$ gem install activejob
原始碼可從 GitHub 上的 Rails 專案下載
授權
Active Job 採用 MIT 授權釋出
支援
API 文件位於
Ruby on Rails 專案的錯誤回報可在此處提交
功能要求應在 rails-core 郵件清單中討論,網址如下: