我应该在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 …