使用延迟作业在后台处理方法
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()
并将作业添加到队列中。
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()
并将作业添加到队列中。