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

时间:2017-11-20 18:22:02

标签: ruby-on-rails delayed-job rails-activejob

Rails 5.1

我的gemfile中有以下内容

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

我安装/更新了宝石

然后我做了:

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在后台处理此方法感到很遗憾。我读到了有一个模型,然后在后台使用该模型过程中的一种方法,但这是不同的。

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

我添加了以下内容:

应用程序/任务/ 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

我的app / controllers / fw_exports_controller.rb:

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

1 个答案:

答案 0 :(得分:1)

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

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

class ProcessSpreadsheetJob < ApplicationJob

    queue_as :default

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

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