¿Dónde debo abrir / cerrar las conexiones JMS en un JSF ManagedBean?
-
28-10-2019 - |
Pregunta
En una aplicación web de demostración simple que usa JSF 2 y AJAX, hay un método en ManagedBean que recibe mensajes de una cola JMS:
@ManagedBean
public class Bean {
@Resource(mappedName = "jms/HabariConnectionFactory")
private ConnectionFactory connectionFactory;
@Resource(mappedName = "jms/TOOL.DEFAULT")
private Queue queue;
public String getMessage() {
String result = "no message";
try {
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(queue);
Message message = consumer.receiveNoWait();
if (message != null) {
result = ((TextMessage) message).getText();
}
connection.close();
} catch (JMSException ex) {
Logger.getLogger(Bean.class.getName()).log(Level.SEVERE, null, ex);
}
return result;
}
}
La conexión JMS se abre / cierra cada vez que se invoca el método getMessage (). ¿Qué opciones tengo que abrir y cerrar la conexión JMS solo una vez en el ciclo de vida del bean, para evitar operaciones frecuentes de conexión/desconexión?
Solución
Primero, mueve tu Connection
para ser una variable de instancia para que se pueda acceder desde su apertura, cierre y getMessage
métodos.
A continuación, cree un openConnection
método con el PostConstruct
anotación.
@PostConstruct
public void openConnection() {
connection = connectionFactory.createConnection();
}
Finalmente, crea un closeConnection
método con el PreDestroy
anotación.
@PreDestroy
public void closeConnection() {
connection.close();
}
Otros consejos
¿Qué tal en el oyente de contexto de servlet?
Solo defina en Web.xml
<listener>
<listener-class>contextListenerClass</listener-class>
</listener>
Y luego implementa un servletContextListener
public final class contextListenerClassimplements ServletContextListener {
...
}
Otra solución puede ser usar SessionSistener ...