从clockwork调用rake任务的语法是什么? 我试过各种语法,但似乎都没用。我对clockwork特别感兴趣,因为Heroku支持它)。
这是我的clock.rb,使用了与whenever gem相同的语法。
module Clockwork
puts "testing clockwork!"
every(30.seconds, 'Send Messages') {
rake 'scheduler:send_messages'
}
end
这里是我的rake任务调度器.rake:
task :send_messages => :environment do
puts "rake task run successfully!"
end
下面是我启动一个时钟进程时的情况:
$ clockwork lib/clock.rb
testing clockwork!
I, [2012-07-16T14:42:58.107245 #46427] INFO -- : Starting clock for 1 events: [ Send Messages ]
I, [2012-07-16T14:42:58.107364 #46427] INFO -- : Triggering 'Send Messages'
attempting to run rake task!
E, [2012-07-16T14:42:58.107437 #46427] ERROR -- : undefined method `rake' for Clockwork:Module (NoMethodError)
每30秒运行一次 如你所见,clock.rb被成功执行。但我实在搞不懂运行rake任务的语法。不幸的是,clockwork readme没有任何帮助。
rake
不是一个方法,所以你不能在这里这样调用它。
你可以掏钱调用它,比如说
every(30.seconds, 'Send Messages') {
`rake scheduler:send_messages`
}
或者使用heroku API调用一个新的分离进程。这是我现在首选的方法。
Heroku::API.new.post_ps('your-app', 'rake scheduler:send_messages')
Heroku::API可从heroku.rb获得。https:/github.comherokuheroku.rb。
你可以将一个块传递给 every
的方法来执行耙任务。
every(1.day, "namespace:task") do
ApplicationName::Application.load_tasks
Rake::Task['namespace:task'].invoke
end
你可以将以下方法添加到你的 clock.rb
文件。
def execute_rake(file,task)
require 'rake'
rake = Rake::Application.new
Rake.application = rake
Rake::Task.define_task(:environment)
load "#{Rails.root}/lib/tasks/#{file}"
rake[task].invoke
end
然后调用
execute_rake("your_rake_file.rake","your:rake:task")
在你的处理程序中
使用以下方法调用任务 Rake::Task['...'].invoke
第一次很好用,但以后需要重新启用任务才能再次调用。
ApplicationName::Application.load_tasks
module Clockwork do
every(10.minutes, "namespace:task") do
Rake::Task['namespace:task'].invoke
Rake::Task['namespace:task'].reenable
end
end
否则任务会在第一次被调用,但之后就不会再被调用,直到时钟进程重新启动。