Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JSF ManagedBean中,我应该在哪里打开/关闭JMS连接?_Java_Jsf_Jsf 2_Jms_Managed Bean - Fatal编程技术网

Java 在JSF ManagedBean中,我应该在哪里打开/关闭JMS连接?

Java 在JSF ManagedBean中,我应该在哪里打开/关闭JMS连接?,java,jsf,jsf-2,jms,managed-bean,Java,Jsf,Jsf 2,Jms,Managed Bean,在一个使用JSF 2和Ajax的简单演示web应用程序中,ManagedBean中有一个从JMS队列接收消息的方法: @ManagedBean public class Bean { @Resource(mappedName = "jms/HabariConnectionFactory") private ConnectionFactory connectionFactory; @Resource(mappedName = "jms/TOOL.DEFAULT")

在一个使用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连接,哪些选项?

在servlet上下文侦听器中如何

只需在web.xml中定义

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

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

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

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

@PostConstruct
public void openConnection() {
    connection = connectionFactory.createConnection();
}
@PreDestroy
public void closeConnection() {
    connection.close();
}
最后,使用
PreDestroy
注释创建一个
closeConnection
方法

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