跳到內容 跳到搜尋

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 們:2331121406#32285

下載和安裝

最新版本的 Active Job 可以使用 RubyGems 安裝

$ gem install activejob

原始程式碼可作為 GitHub 上 Rails 專案的一部分下載

授權

Active Job 在 MIT 授權下發行

支援

API 文件在

Ruby on Rails 專案的 Bug 報告可以歸檔至此

功能需求應在此的 rails-core 郵寄清單討論