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
轉接器作為其寶石的一部分或作為獨立寶石。若要討論這個議題,請參閱下列 PR 們:23311、21406 和 #32285。
下載和安裝
最新版本的 Active Job 可以使用 RubyGems 安裝
$ gem install activejob
原始程式碼可作為 GitHub 上 Rails 專案的一部分下載
授權
Active Job 在 MIT 授權下發行
支援
API 文件在
Ruby on Rails 專案的 Bug 報告可以歸檔至此
功能需求應在此的 rails-core 郵寄清單討論