Domanda Come utilizzo Rails clockwork gem per eseguire le attività rake?


Qual è la sintassi per chiamare le attività di rake da un orologio? Ho provato tutti i tipi di sintassi e niente sembra funzionare. (Sono particolarmente interessato al meccanismo a orologeria perché Heroku lo supporta).

Ecco il mio clock.rb, che usa la stessa sintassi usata da Gem quando:

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

Ed ecco il mio compito di rake in scheduler.rake:

task :send_messages => :environment do
  puts "rake task run successfully!"
end

Ed ecco cosa succede quando avvio un processo a orologeria:

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

Questo funziona ogni 30 secondi. Come puoi vedere, clock.rb viene eseguito con successo. Ma non posso per la vita di me capire la sintassi per eseguire un compito rake. Il readme di un orologio non è d'aiuto, sfortunatamente:

https://github.com/tomykaira/clockwork


11
2017-07-16 21:47


origine


risposte:


rake non è un metodo, quindi non puoi invocarlo così qui.

Puoi bombardare e invocarlo, qualcosa del genere

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

o piuttosto invoca un nuovo processo distaccato usando l'API heroku. Questo è il mio metodo preferito in questo momento:

Heroku::API.new.post_ps('your-app', 'rake scheduler:send_messages')

Heroku :: API è disponibile da heroku.rb: https://github.com/heroku/heroku.rb


9
2017-07-17 04:27



Puoi aggiungere il seguente metodo al tuo clock.rb file:

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

e poi chiama

execute_rake("your_rake_file.rake","your:rake:task")

nel tuo gestore


3
2017-07-03 10:21



Puoi passare in un blocco a every che esegue il tuo rake task:

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

3
2017-12-19 03:11