2010-07-26 8 views
5

Sto lavorando per far funzionare correttamente la nostra app Rails 2.3.8 sotto JRuby. Tutto funziona alla grande fino a quando non abilito config.threadsafe! per ottenere la concorrenza che JRuby offre. Ciò ha causato l'interruzione del caricamento automatico di moduli e classi in lib/.Qual è il modo corretto di caricare moduli/classi da lib/quando si usa config.threadsafe! opzione?

con config.threadsafe! abilitato:

$ ruby script/runner -e production 'p Sim::Sim200Provisioner' 

/Users/amchale/.rvm/gems/[email protected]/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in `const_missing': uninitialized constant Sim::Sim200Provisioner (NameError) 
    from (eval):1 

con config.threadsafe! disabilitato:

$ ruby script/runner -e production 'p Sim::Sim200Provisioner' 
Sim::Sim200Provisioner 

Il file in questione è lib/sim/sim200_provisioner.rb dove Sim è app/modelli/sim.rb. Rotaie normalmente non ha problemi a trovare e caricare il file.

Ho bisogno di richiedere manualmente tutte le nostre librerie, o c'è un modo più simile a Rails per gestirlo che mi manca?

risposta

7

Il documentation di threadsafe! menziona che disabilita il caricamento automatico delle dipendenze. Il motivo è che potrebbero esserci delle condizioni di gara durante il caricamento dei file se due o più thread decidono entrambi di mancare ancora una determinata classe.

Invece, è necessario manualmente require tutti i file necessari in un initializer.

0

Il collegamento della documentazione non contiene informazioni, quindi ecco alcuni documenti rilevanti per #threadsafe! :

Abilita modalità thread. Consente le richieste simultanee alle azioni del controllore e alle connessioni del database multiple . Inoltre, disabilita il caricamento automatico delle dipendenze dopo l'avvio e disabilita il codice di ricaricamento su ogni richiesta , poiché queste sono fondamentalmente incompatibili con la sicurezza del thread .

Problemi correlati