问题描述
|
如何从rake文件创建延迟的作业。我应该如何将其移入控制器并创建一个每15分钟运行一次任务的delay_job。
这是我的rake文件的示例:
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)?
解决方法
建议您看一下SimpleWorker,它是Ruby应用程序的基于云的后台处理/工作队列。它设计用于卸载任务,运行计划的作业以及扩展以一次处理许多并行作业。它简单,经济,可扩展。
(公开,我为公司工作。)
您可以在应用程序/工作人员中创建您的工作人员,然后在控制器中和其他位置将它们排队以立即运行,或者仅用几行代码就可以安排它们以后或循环使用。这是一个基本示例。
工作者= ReportWorker.new
worker.user_id = @ current_user.id
worker.schedule(:start_at => 1.hours.since,:run_every => 900)
#或者立即运行一次
#worker.queue
ReportWorker类将包含为当前用户创建报告并发送或发布所需逻辑的逻辑。
,因为DelayedJob是基于一次性工作的,所以单独使用DelayedJob并不能帮助您。您仍然需要定期运行的东西来创建这些工作。
假设:
您在Heroku上,只能获得1小时的cron
您需要每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),15.minutes.from_now
Delayed::Job.enqueue MechanizeJob.new(url),30.minutes.from_now
Delayed::Job.enqueue MechanizeJob.new(url),45.minutes.from_now
end
end
这将每15分钟针对每个网址运行一次作业。