ruby-on-rails 在ActiveJob中将多个作业入队

nvbavucw  于 2023-01-27  发布在  Ruby
关注(0)|答案(2)|浏览(183)

我想知道是否有一种方法可以在ActiveJob中将多个作业入队?类似于sidekiq push_bulk。

Sidekiq::Client.push_bulk(sidekiq_items)

我需要排队成千上万的工作,它需要太多的时间来做一个接一个。

6qftjkof

6qftjkof1#

您不能这样做。ActiveJob没有针对每个Sidekiq特性的抽象。

rt4zxlrg

rt4zxlrg2#

到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。

相关问题