11

从时钟系统调用 rake 任务的语法是什么?我尝试了各种语法,但似乎没有任何效果。(我对发条特别感兴趣,因为 Heroku 支持它。)

这是我的clock.rb,使用与gem 使用的相同语法:

module Clockwork
  puts "testing clockwork!"
  every(30.seconds, 'Send Messages') {
    rake 'scheduler:send_messages'
    }
end

这是我在 scheduler.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 任务的语法。不幸的是,发条自述文件没有帮助:

https://github.com/tomykaira/clockwork

4

4 回答 4

10

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.com/heroku/heroku.rb

于 2012-07-17T04:27:19.843 回答
4

你可以传入一个块来every执行你的 rake 任务:

every(1.day, "namespace:task") do
  ApplicationName::Application.load_tasks
  Rake::Task['namespace:task'].invoke
end
于 2014-12-19T03:11:16.630 回答
3

您可以将以下方法添加到您的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")

在你的处理程序中

于 2013-07-03T10:21:53.587 回答
1

第一次调用任务使用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

否则,该任务将在第一次被调用,但之后不会再被调用,直到时钟进程重新启动。

于 2020-05-06T08:37:51.777 回答