跳到內容 跳到搜尋

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 轉接器作為其寶石的一部分,或作為獨立的寶石。有關此討論,請參閱以下公關:2331121406#32285

下載和安裝

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

$ gem install activejob

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

授權

Active Job 在 MIT 授權下發布

支援

API 文件位於

Ruby on Rails 專案的錯誤回報可以提交至

功能要求應在 rails-core 郵件列表中討論,網址如下

命名空間
方法
G
P
U
V

類別公開方法

gem_version()

傳回目前載入的 Active Job 版本,為 Gem::Version

# 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 來傳達每個工作的佇列狀態。

# 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 中移除,連同此設定檔。

# File activejob/lib/active_job.rb, line 53
singleton_class.attr_accessor :use_big_decimal_serializer

version()

傳回目前載入的 Active Job 版本,為 Gem::Version

# File activejob/lib/active_job/version.rb, line 7
def self.version
  gem_version
end