如何使用 Rails clockwork gem 运行 rake 任务?

问题描述 投票:11回答:4

从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没有任何帮助。

https:/github.comtomykairaclockwork.

ruby-on-rails heroku rake
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.comherokuheroku.rb。


4
投票

你可以将一个块传递给 every 的方法来执行耙任务。

every(1.day, "namespace:task") do
  ApplicationName::Application.load_tasks
  Rake::Task['namespace:task'].invoke
end

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")

在你的处理程序中


0
投票

使用以下方法调用任务 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

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

© www.soinside.com 2019 - 2024. All rights reserved.