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 进程已经将其从队列中弹出并正在执行。队列为空,但作业尚未完成。
我有一个包含 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 进程已经将其从队列中弹出并正在执行。队列为空,但作业尚未完成。