Buongiorno,
ho la necessità di avviare un processo in background, che accede al db,
non appena l’applicazione Rails diviene attiva. Per l’esecuzione di tale
processo ho optato per Spawn, il quale sembra funzionare correttamente.
Trovo invece grosse difficoltà ad eseguire il codice allo startup.
Spulciando la documentazione sul processo di init sembra che il posto
migliore per inserire tale blocco sia nel config.after_initialize
all’interno di config/enviroments/xxx.rb. Il problema è che Rails
lamenta sempre un “undefined method spawn”.
Notando che nell’init.rb del plugin lo stesso viene incluso nella classe
ActiveRecord::Base ho quindi optato per la creazione della seguente
classe:
class Setup < ActiveRecord::Base
def initialize
spawn do
RAILS_DEFAULT_LOGGER.error(‘start bg controll process’)
while true
… code
sleep(10)
end
end
end
end
che istanzio dentro il solito file enviroment/…
config.after_initialize do
s = Setup.new
end
Questa volta nessuna lamentela per il plugin, ma ottengo un laconico:
/Library/Ruby/Gems/1.8/gems/activerecord-2.1.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:29:in
`table_structure’: Could not find table ‘setups’
(ActiveRecord::StatementInvalid)
On Mon, Sep 1, 2008 at 10:48 AM, Daniele T. [email protected]
wrote:
non appena l’applicazione Rails diviene attiva.
potresti definire meglio cosa intendi con questo?
(io suggerirei di far eseguire da capistrano un qualche script subito
dopo il restart dei processi, ma forse non e’ quello che cerchi)
On Mon, Sep 1, 2008 at 11:18 AM, Daniele T. [email protected]
wrote:
Se è un qualcosa che devi lanciare all start-up dell’applicazione c’è fresco
fresco dai Pessanger guys deamon
controllerhttp://blog.phusion.nl/2008/08/25/daemon_controller-a-library-for-robust-daemon-management/che
ti permette di far partire qualche demone all’avvio della tua
applicazione. Altre soluzioni ci sono, ma se fosse questa la tua
necessità
lo proverei.
Sul link che ti ho mandato ci sono anche alcuni esempi, e il tutto
dovrebbe
essere leggero e semplice. Fammi sapere se è quello che cerchi.
Ciao Stefano,
grazie per il consiglio. Ho provato a istanziare la classe Setup che
contiene il codice all’interno di un file inizializer e ottengo lo
stesso errore:
/Library/Ruby/Gems/1.8/gems/activerecord-2.1.0/lib/active_record/connection_adapters/sqlite3_adapter.rb:29:in
`table_structure’: Could not find table ‘setups’
(ActiveRecord::StatementInvalid)
Ciao Andrea,
grazie per il suggerimento, avevo già adocchiato daemon_controller ma
poi ho preferito Spawn perchè il primo mi sembrava più orientato a
gestire processi esterni. Ora provo a vedere se è facilmente
utilizzabile con un un metodo, es:
:start_command => method(:start_bgprocess)
Ti propongo un esempio che riprende quanto presentato sulla
documentazione.
Da quel che mi sembra di aver capito tutti questi parametri sono
obbligatori
(99% sicuro).
L’unico dubbio che mi riguarda sta unicamente nel sapere quale sia il
pid_file, ma se qualcuno toglie anche questo dubbio credo sia una
soluzione
piuttosto semplice. Direi che questo codice potrebbe andare benissimo
all’interno di un Initializer così parte all’avvio della Rails app.
On Mon, Sep 1, 2008 at 11:18 AM, Daniele T. [email protected]
wrote:
Se è un qualcosa che devi lanciare all start-up dell’applicazione c’è fresco
fresco dai Pessanger guys deamon
controller
Ciao Andrea,
grazie per il suggerimento, avevo già adocchiato daemon_controller ma
poi ho preferito Spawn perchè il primo mi sembrava più orientato a
gestire processi esterni. Ora provo a vedere se è facilmente
utilizzabile con un un metodo, es:
Non è proprio l’eleganza in persona ma dovrebbe reggere, che dite?
Dai primi test sembra comportarsi bene… vi terrò aggiornati. Se nel
frattempo qualcun altro vuole propormi qualche alternativa per lo
startup sono tutt’orecchi
P.S. Nel codice di esempio ho inserito un refuso, al posto di session[]
uso in realtà ENV[] in quanto l’avvio del thread deve essere eseguito
una sola volta al lancio dell’applicazione.
Il grosso problema di questo approccio è che essendo uno script esterno
perdo l’accesso alle classi (almeno non sono riuscito a capire come
accedere alle stesse, un require File.dirname(FILE) +
‘/…/config/boot’ iniziale non è servito a molto).
Poi ho il grosso sospetto che il ping_command sia riferito al processo
che lancio, il quale quindi deve essere a tutti gli effetti un server in
ascolto, cosa che non avviene nel mio caso.
Ma se facessi qualcosa del genere:
def bgjob
if session[‘bgstarted’] != ‘yes’ then
spawn do
… code
end
session[‘bgstarted’] = ‘yes’
end
end
class ApplicationController < ActionController::Base
before_filter: bgjob
…
end
Così da richiamare il codice solo prima del primo request?
Non è proprio l’eleganza in persona ma dovrebbe reggere, che dite?
ciao,
d.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.