Где я должен открывать / закрывать JMS-соединения в JSF ManagedBean? - PullRequest
4 голосов
/ 03 мая 2011

В простом демонстрационном веб-приложении, использующем JSF 2 и Ajax, в ManagedBean есть метод, который получает сообщения из очереди 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;
    }
}

Соединение JMS открывается / закрывается каждый раз, когда вызывается метод getMessage (). Какие варианты мне нужно открывать и закрывать соединение JMS только один раз в жизненном цикле компонента, чтобы избежать частых операций подключения / отключения?

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Сначала переместите Connection в переменную экземпляра, чтобы к ней можно было обращаться из ваших методов open, close и getMessage.

Затем создайте метод openConnection с аннотацией PostConstruct.

@PostConstruct
public void openConnection() {
    connection = connectionFactory.createConnection();
}

Наконец, создайте метод closeConnection с аннотацией PreDestroy.

@PreDestroy
public void closeConnection() {
    connection.close();
}
0 голосов
/ 04 мая 2011

Как насчет прослушивателя контекста сервлета?

Просто определите в web.xml

<listener>
  <listener-class>contextListenerClass</listener-class>
</listener>

А затем реализовать servletContextListener

public final class contextListenerClassimplements ServletContextListener {
...
}

Другим решением может быть использование SessionListener ...

...