Как сохранить запись с помощью фонового рабочего? - PullRequest
2 голосов
/ 14 февраля 2011

Если я сохраняю видеофайл на сервере, размер которого превышает 5 МБ.Должен ли я создать фоновое задание для сохранения этого файла?

Как это сделать?Моя видео модель имеет заголовок, описание и вложение столбцы / поля.Все поля обязательны для заполнения.

В def create вместо "if @ video.save" я должен сделать что-то вроде "если Resque.enqueue (Save, @video) "?

Я не совсем уверен, как это можно сделать, поскольку передача аргумента в Resque.enqueue () превращает его в хеш.Во-вторых, с "", если Resque.enqueue (Save, @video) "", ожидает истину или ложь.Однако Resque.enqueue не может ничего вернуть.Или я не прав?

Строка кнопок есть.Как правильно сохранить запись с помощью фонового рабочего с помощью resque + redis?

В идеале я думал, что это должно выглядеть примерно так:

def create
  @video = Video.new(params[:video])

  respond_to do |format|
    if Resque.enqueue(Save)
      ...
    end
end

module Save
  @queue = :save

  def self.perform
    video = Video.new(params[:video])
    video.save
    return true
  end
end

Что вы думаете?

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

Понимая ситуацию снова.Я не думаю, что загрузчики предназначены для отсрочки работы .. подумайте об этом.что произойдет, если загружаемый файл будет поставлен в очередь на 10-й позиции.Откуда он ожидает получить файл?

Как цитирует другой разработчик: «Есть обработчики HTTP-запросов и только фоновые процессы. Вам нужно обработать исходную загрузку в обработчике http-запросов, и ТОГДА вы можете запустить внешний фоновый процесс, чтобы загрузить его на S3формировать локальный диск ".

Это означает, что нормально иметь несколько обработчиков HTTP-запросов, изначально запущенных для обработки этих типов запросов.

Надеюсь, это прояснит некоторые вещи для пользователей, которыев конечном итоге столкнуться с той же проблемой.

0 голосов
/ 14 февраля 2011

Я бы хотел, чтобы пользователи загружали UnencodedVideo. Затем, в своем методе create, он запускает задание для кодирования видео (используя resque / delayedjobs), которое создаст Video.

class UnencodedVideo
  def after_create
    Resque.enqueue(Encoder, this.id)
  end
end

class Encoder
  def self.perform(unencoded_video_id)
    unencoded_video = UnencodedVideo.find(unencoded_video_id)
    ...
    video.save
  end
end

class Video
end
...