使用延迟作业在后台处理方法

Using delayed job to process a method in background

Rails 5.1

我的 gemfile 中有以下内容

gem 'delayed_job'
gem 'delayed_job_active_record'
gem 'daemons'

我installed/updated宝石

然后我做了:

rails generate delayed_job:active_record

这在 bin 中生成了两个名为 delayed_jobs.rb 的文件并创建了迁移文件。

我在 config/application.rb 中添加了以下内容:

config.active_job.queue_adapter = :delayed_job

我有一个控制器,它有一个动作,它接受一个已经上传的 csv 文件,解析它,并用数据填充数据库。我希望在后台处理该方法,或者特别是该方法的一部分。

方法是:

def process_parsed_spreadsheet
  temp_file_path = params[:temp_file_path]
  @spreadsheet   = helpers.open_worksheet(temp_file_path)
  number_of_rows = @spreadsheet.count - 1

  helpers.process_spreadsheet(number_of_rows, @spreadsheet, params[:followed_id])
  helpers.remove_uploaded_file(temp_file_path)

  redirect_to root_path, notice: t('fw_exports.file_successfully_processed')
end

我不知道如何使用 delayed_jobs 在后台处理这个方法。我阅读了有关拥有模型的信息,然后在后台使用该模型过程中的一种方法,但这是不同的。

解决方案(基于以下答案):

我添加了以下内容:

app/jobs/parse_and_process_spreadsheet_job.rb

class ParseAndProcessSpreadsheetJob < ApplicationJob
  queue_as :default

  def perform(temp_file_path, followed_id)
    @spreadsheet = helpers.open_worksheet(temp_file_path)
    number_of_rows = @spreadsheet.count - 1
    helpers.process_spreadsheet(number_of_rows, @spreadsheet, followed_id)
    helpers.remove_uploaded_file(temp_file_path)
    redirect_to root_path, notice: t('fw_exports.file_successfully_processed')
  end
end

还有我的 app/controllers/fw_exports_controller.rb:

def process_parsed_spreadsheet
  ParseAndProcessSpreadsheetJob.perform(params[:temp_file_path], params[:followed_id])
end

根据 the documentation,您应该可以在 class 方法之后添加 handle_asynchronously :process_parsed_spreadsheet

当我使用 active_job 时,我通常会在 app/jobs 中创建一个新文件,例如process_spreadsheet_job.rb 然后创建一个继承自 ApplicationJob 的新 class。这是一个最小的例子:

class ProcessSpreadsheetJob < ApplicationJob

    queue_as :default

    def perform(temp_file_path:)
        # Your custom method here.
    end
end

然后您可以在您的应用程序控制器中调用 ProcessSpreadsheetJob.perform_later() 并将作业添加到队列中。