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は正常に実行されています。しかし、私は一生の間、レーキタスクを実行するための構文を理解することはできません。残念ながら、時計仕掛けのreadmeは役に立ちません。

https://github.com/tomykaira/clockwork

4

4 に答える 4

10

rakeはメソッドではないため、ここではそのように呼び出すことはできません。

シェルアウトして呼び出すことができます。

every(30.seconds, 'Send Messages') {
  `rake scheduler:send_messages`
}

または、herokuAPIを使用して新しいデタッチプロセスを呼び出します。これは今のところ私の好みの方法です:

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

everyrake タスクを実行するブロックを に渡すことができます。

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 に答える