代码之家  ›  专栏  ›  技术社区  ›  EastsideDev

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

  •  2
  • EastsideDev  · 技术社区  · 7 年前
    Rails 5.1
    

    我的GEM文件中有以下内容

    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_作业处理此方法。我读过关于有一个模型,然后在后台有一个模型过程中的方法,但这是不同的。

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

    我补充了以下内容:

    app/jobs/parse_和process_spreadsheet_作业。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
    

    我的应用程序/控制器/fw\u导出控制器。rb:

    def process_parsed_spreadsheet
      ParseAndProcessSpreadsheetJob.perform(params[:temp_file_path], params[:followed_id])
    end
    
    1 回复  |  直到 4 年前
        1
  •  2
  •   Charlie Weems    7 年前

    根据 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() 并将作业添加到队列中。