Rails помогает создать delayed_job из файла rake - PullRequest
0 голосов
/ 14 апреля 2011

Как мне создать отложенное задание из файла rake.Как мне переместить его в контроллер и создать delayed_job, который запускает задачу каждые 15 минут.

Вот пример того, как мой файл рейка:

namespace :reklamer do

    task :runall => [:iqmedier, :euroads, :mikkelsen] do
      # This will run after all those tasks have run
    end

      task :iqmedier => :environment do
              require 'Mechanize'
              agent = WWW::Mechanize.new
              agent.get("http://www.iqmedier.dk")
      end
      task :euroads => :environment do
            require 'Mechanize'
            require 'pp'
            agent = Mechanize.new { |agent|
      end

      task :mikkelsen => :environment do
            require 'Mechanize'
            agent = Mechanize.new
            agent.get("http://affilate.mikkelsenmedia.dk/partnersystem/mylogins.php")
       end
    end

Что я должен изменить, чтобы бытьотложенная работа (https://github.com/collectiveidea/delayed_job)?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2011

Предлагаем вам взглянуть на SimpleWorker, облачную фоновую обработку / рабочую очередь для приложений Ruby.Он предназначен для разгрузки задач, выполнения запланированных заданий и масштабирования для одновременной обработки множества параллельных заданий.Это просто, доступно и масштабируемо.

(Раскрытие информации, я работаю на компанию.)

Вы создаете своих работников (в приложении / работнике), а затем в своих контроллерах и в других местах ставите их в очередь, чтобы сразу же запустить или запланировать их напозже или периодически с помощью всего лишь нескольких строк кода.Вот базовый пример.

  worker = ReportWorker.new
  worker.user_id = @current_user.id
  worker.schedule(:start_at => 1.hours.since, :run_every => 900)

  #Or to run once right away
  #worker.queue

Класс ReportWorker будет содержать логику для создания отчета для текущего пользователя и отправки или отправки необходимого сообщения.

0 голосов
/ 15 апреля 2011

Сам DelayedJob не поможет вам, поскольку он основан на разовых заданиях. Вам все еще понадобится что-то, что выполняется регулярно и создает эти задания.

Предполагая, что:

  1. Вы находитесь на Heroku и можете получить только 1-часовой крон
  2. вам нужно запускать работу каждые 15 минут

Вы можете сделать что-то вроде этого ...

Создайте класс для вашей работы:

class MechanizeJob < Struct.new(:url)
  def perform
    agent = Mechanize.new
    agent.get(url)
  end
end

Расписание заданий из вашего Rakefile:

task :schedulejobs => :environment do
  urls = ["http://...", "http://...", "http://..."]
  urls.each do |url|
    # 1 is the job priority
    Delayed::Job.enqueue MechanizeJob.new(url), 1, Time.now
    Delayed::Job.enqueue MechanizeJob.new(url), 1, 15.minutes.from_now
    Delayed::Job.enqueue MechanizeJob.new(url), 1, 30.minutes.from_now
    Delayed::Job.enqueue MechanizeJob.new(url), 1, 45.minutes.from_now
  end
end

Это будет запускать задание на URL каждые 15 минут.

...