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?

¿Fue útil?

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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top