2011-10-02 9 views
7

Tengo un servidor de EventMachine que estoy monitoreando con Monit. A veces se cuelga, y estoy tratando de descubrir por qué, pero no me queda claro cómo puedo registrar todas las fallas de nivel superior. Probé un código como este:¿Cómo atrapar fallas de nivel superior en un servidor de EventMachine?

begin 
    EventMachine::run do 
    EventMachine::start_server('0.0.0.0', PORT, MyServer) 
    end 
rescue Exception => e 
    puts "FAILURE: #{e.class}: #{e}" 
end 

pero eso parece que nunca detecta errores. Sospecho que podría ser algo así como quedarse sin memoria, que estoy rastreando por separado, pero aún así me gustaría que este servidor registre su causa próxima de falla si es posible.

Respuesta

15

Si desea un manejador de errores catch-all, intente EM.error_handler. Ejemplo de la docs:

EM.error_handler{ |e| 
    puts "Error raised during event loop: #{e.message}" 
} 

Usted también puede querer más la gestión de errores de grano fino, en cuyo caso se puede utilizar el mecanismo de errback (ver Deferrable). Así, por ejemplo, usted podría tener en su circuito del reactor:

EventMachine::run do 
    server = EventMachine::start_server('0.0.0.0', PORT, MyServer) 
    server.errback { # handle error thrown by server here } 
end 

Para que esto funcione, include Deferrable en su MiServidor, a continuación, cada vez que desee generar un error, llame fail.

Cuestiones relacionadas