我应该在JSF ManagedBean中打开/关闭JMS连接的位置?

在使用JSF 2和Ajax的简单演示Web应用程序中,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; } } 

每次调用getMessage()方法时都会打开/关闭JMS连接。 在bean生命周期中,我只需要打开和关闭JMS连接一次,以避免频繁的连接/断开操作?

首先,将Connection移动为实例变量,以便可以从open,close和getMessage方法访问它。

接下来,使用PostConstruct注释创建一个openConnection方法。

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

最后,使用PreDestroy注释创建一个closeConnection方法。

 @PreDestroy public void closeConnection() { connection.close(); } 

在servlet上下文监听器中怎么样?

只需在web.xml中定义即可

  contextListenerClass  

然后实现一个servletContextListener

 public final class contextListenerClassimplements ServletContextListener { ... } 

其他解决方案可以使用SessionListener …