Rails Sidekiq 队列大小不起作用

Rails Sidekiq Queue size not working

我有一个包含 2 个作业(ImportCsvJob 和 ProcessCsvJob)的 Rails 应用程序。这样我就可以在应用程序中明显地提示队列中仍有作业,我有这个辅助方法(在 application_helper.rb 内):

module ApplicationHelper
   def queued_job_count
        Sidekiq::Queue.new.size
    end
end

然后我在我的索引控制器上使用它,然后传递给视图进行处理并在应用程序中给出视觉提示。

  def index
    @still_have_jobs = !queued_job_count.zero?
  end

然而,这在我仍然有 1 个后台作业 (ImportCsvJob) 时有效,但是当我添加 (ProcessCsvJob) 时它不再有效。

import_csv_job.rb

require 'open-uri'

class ImportCsvJob < ActiveJob::Base
  queue_as :default

  def perform(csv_record)
    csv_record[:object_changes] = ApplicationController.helpers.generate_hash(csv_record[:object_changes])
    ObjectRecord.create(csv_record)
  end
end

process_csv_job.rb

class ProcessCsvJob < ActiveJob::Base
  queue_as :default

  def perform(csv_path)
    csv_file = open(csv_path,'rb:UTF-8')

    options = {
        row_sep: :auto, col_sep: ",", 
        user_provided_headers: [:object_id, :object_type, :timestamp, :object_changes], 
        remove_empty_values: true, 
        headers_in_file: true
    }

    SmarterCSV.process(csv_file, options) do |array|
        ImportCsvJob.perform_later(array.first)
    end
  end

end

最后,在调用它的模型中:

ProcessCsvJob.perform_later(gdrive.uploaded_file_link)

当我尝试使用 Sidekiq::Queue.new.size 在 Rails 控制台中进行调试时,它仍然给出 0.

运行:

redis-server
bundle exec sidekiq

所以,基本上我使用 Web 界面为 sidekiq 添加了一个监控以查看发生了什么:

正如我所检查的那样,没有排队的任务也没有安排,因为大部分作业都设置为几乎立即(并行)执行。

因此,这是我的解决方案,用于了解忙碌工作的数量:

module ApplicationHelper
    def queued_job_count
        Sidekiq::ProcessSet.new.first['busy']
    end
end

然后在索引上:

  def index
    @still_have_jobs = !queued_job_count.zero?
  end

有效! :)

正在执行的作业不再排队。 Sidekiq 进程已经将其从队列中弹出并正在执行。队列为空,但作业尚未​​完成。