2010-07-26 13 views
5

He estado trabajando para que nuestra aplicación Rails 2.3.8 funcione correctamente bajo JRuby. Todo funciona bien hasta que habilite config.threadsafe! para lograr la concurrencia que JRuby ofrece. Esto provocó que los módulos y las clases en lib/ dejaran de cargarse automáticamente.¿Cuál es la forma correcta de cargar módulos/clases desde lib/cuando se usa config.threadsafe! ¿opción?

con config.threadsafe! habilitado:

$ 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! discapacitados:

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

El archivo en cuestión es lib/SIM/sim200_provisioner.rb donde Sim es app/models/sim.rb. Rails normalmente no tiene problemas para encontrar y cargar el archivo.

¿Necesito manualmente todas nuestras librerías, o hay una forma más similar a la de Rails para manejarlo que me falta?

Respuesta

7

El documentation de threadsafe! menciona que desactiva la carga de dependencia automática. La razón es que puede haber condiciones de carrera durante la carga de archivos si dos o más hilos deciden que todavía faltan una cierta clase.

En su lugar, debe manualmente require todos los archivos que necesita en un initializer.

0

El enlace de documentación no contiene información, por lo que aquí hay algunos documentos relevantes para #threadsafe. :

Habilita el modo enhebrado. Permite solicitudes concurrentes a las acciones del controlador y conexiones de base de datos múltiples . También deshabilita la carga de dependencia automática después del arranque, y deshabilita el código de recarga en cada solicitud , ya que son fundamentalmente incompatibles con la seguridad de subprocesos.

Cuestiones relacionadas