Активное задание Rails: выполнить позже не выполняется в фоновом режиме

у меня есть длительная задача, которая должна выполняться в фоновом режиме в моем приложении Rails 4.2.6. К сожалению, задание не отправляется в фоновый режим с помощью активного задания. Я создал работу:

class PhotoProcessorJob < ActiveJob::Base
  queue_as :default
  def perform(*args)
    ::Photo.process_photos
  end
end

который вызывает метод в моем классе фотографий (хранится в config / initializers):

class Photo
  require 'zxing'
  require 'csv'

  @tablePath = Dir.glob("#{Rails.root.to_s}/tmp/photo_processing/*.csv")[0]
  @output = "#{Rails.root.to_s}/tmp/photo_data.csv"

  def self.getStudentInfo(id)
    CSV.foreach(@tablePath, headers: true) do |row|
      if row["Student ID"] == id
        return row
      else
        next
      end
    end
  end

  def self.writeInfoToFile(data, file)
    first_name = data["First Name"]
    last_name = data["Last Name"]
    student_id = data["Student ID"]
    grade = data["Grade"]
    email = data["Email"]
    photo = file.to_s
    CSV.open(@output, "a+") do |csv|
      csv << [first_name, last_name, student_id, grade, email, photo]
    end
  end

  def self.process_photos
    extensions = %w(.jpg .jpeg .png .gif .tif)
    studentInfo = nil
    newfile = false
    if File.exist?(@output)
      outfile = CSV.new(File.read(@output))
      if outfile.count == 0
        newfile = true
      end
    else
      newfile = true
    end
    if newfile
      CSV.open(@output, "wb") do |csv|
        csv << ["First Name", "Last Name", "Student ID", "Grade", "Email", "Photo"]
      end
    end
    Dir.glob("#{Rails.root.to_s}/tmp/photo_processing/*").each do |file|
      if file.match(/#{extensions.join("|")}/)
        id = ZXing.decode File.new(file)
        unless id.nil?
          studentInfo = getStudentInfo(id)
        else
          writeInfoToFile(studentInfo, file) unless studentInfo.nil?
        end
      end
    end
  end

end

и вызвал из контроллера:

class ProcessingController < ApplicationController
  def finish
    PhotoProcessorJob.perform_later
  end
end

Я пытаюсь использовать встроенный бэкэнд активного задания и поэтому не имею установленных библиотек очередей. Проблема в том, что вид "готово" задерживается, пока process_photos метод выполняется, а не отправляется в фоновом режиме и представление отображается немедленно. Это приводит к ошибке 502 в Nginx, вызванной upstream prematurely closed connection предположительно, из-за process_photos задача занимает слишком много времени, чтобы завершить.

Я сделал что-то не так с моей активной настройкой работы?

1 ответов


цитировать документы:

Rails по умолчанию поставляется с реализацией очереди "немедленного бегуна". Это означает, что каждое задание, которое было поставлено в очередь немедленно бежать.

Это означает, что по умолчанию активное задание будет выполняться в основном потоке, а не в "фоновом режиме". Это обычное дело. В основном активное задание - это просто общий API для нескольких бэкэндов очереди.

TL; DR вы должны настроить бэкэнд очереди, как Sidekiq.

в противном случае ваша настройка выглядит великолепно, даже учебник.