2010-03-08 8 views
6

Mi aplicación utiliza un resorte DefaultMessageListenerContainer para procesar los mensajes entrantes. El método principal de la aplicación ya registra un gancho de cierre.¿La mejor manera de forzar el cierre de primavera de un frijol?

La pregunta es esta: ¿cuál es la mejor manera de cerrar el contexto de la aplicación?

Si tiro un RuntimeException en el detector de mensajes, es manejado por el contenedor y no se transmite. ¿Está llamando a System.exit como aceptable? ¿Paso el ApplicationContext a cada clase que deba cerrarse, para que pueda llamar al close() en él?

+1

¿por qué es necesario cerrar abajo del contexto de la aplicación? – Bozho

+0

Porque el oyente de mensajes puede decidir que lo necesita; ya sea porque ha recibido un mensaje de administración solicitando que se apague la aplicación o porque se ha producido una condición anormal. Hay muchos de ellos, uno de ellos es que se reciben demasiados reintentos (este es un sistema de alto volumen) – xcut

Respuesta

13

Puede transmitir el contexto de la aplicación al ConfigurableApplicationContext y llamar al close() en él. Al menos eso es lo que sucede cuando el contexto se cierra en un entorno de aplicación web, en los casos en que se destruye el contexto del servlet.

Si desea obtener Ahold de la ApplicationContext, el bean puede implementar ApplicationContextAware

Otra opción es inyectar (o Autowire con @Autowired) el contexto de aplicación:

@Inject 
private ApplicationContext ctx; 
+0

¿Cómo funciona el bean que necesita hacer el apagado para obtener el contexto? Es un POJO después de todo .. – xcut

+0

@xcut depende de su aplicación. ¿Es una aplicación web, una aplicación de escritorio? – Bozho

+0

Ninguno: un sistema de encolamiento/enrutamiento de mensajes. Entonces, ¿supongo que la única forma sería pasar el contexto al bean o implementar una interfaz de ciclo de vida adicional de algún tipo? – xcut

Cuestiones relacionadas