4

在一个使用 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 连接,以避免频繁的连接/断开操作?

4

2 回答 2

2

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

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

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

Finally, create a closeConnection method with the PreDestroy annotation.

@PreDestroy
public void closeConnection() {
    connection.close();
}
于 2011-06-10T04:24:15.487 回答
0

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

只需在 web.xml 中定义

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

然后实现一个servletContextListener

public final class contextListenerClassimplements ServletContextListener {
...
}

其他解决方案可以是使用 SessionListener ...

于 2011-05-04T14:24:47.127 回答