在活动作业中对多个作业进行排队



我想知道是否有办法在 ActiveJob 中将多个作业排队?类似于 sidekiq push_bulk。

Sidekiq::Client.push_bulk(sidekiq_items)

我需要将数千个作业排队,并且需要花费太多时间才能逐个完成。

你不能。 ActiveJob 没有针对每个 Sidekiq 功能的抽象。

从 Rails 7 开始,ActiveJob 中仍然没有内置的方法来实现这一点,但很容易推出自己的方法。(这证明了 Sidekiq 的质量和耐用性,这个问题在 8 年后仍然有意义!

class ApplicationJob < ActiveJob::Base
  def self.perform_later_bulk(array_of_args)
    sidekiq_args = array_of_args.map { |args| [new(*args).serialize] }
    Sidekiq::Client.push_bulk(
      'class' => ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper,
      'wrapped' => self,
      'queue' => sidekiq_args[0][0]['queue_name'],
      'args' => sidekiq_args
    )
  end
end
def SomeJob < ApplicationJob
  def perform(arg1, arg2)
    # etc
  end
end
# Usage: SomeJob.perform_later_bulk([[arg1, arg2], [arg1, arg2], ...])

在 Rails 7 上测试过,但它至少应该可以追溯到 5.2。

最新更新