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

发布于 2024-11-04 15:12:22 字数 1114 浏览 12 评论 0原文

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

In a simple demo web app using JSF 2 and Ajax, there is a method in the ManagedBean which receives messages from a JMS queue:

@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;
    }
}

The JMS connection is opened / closed every time the getMessage() method is invoked. Which options do I have to open and close the JMS connection only once in the bean life cycle, to avoid frequent connect/disconnect operations?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

云雾 2024-11-11 15:12:23

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

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

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

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

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

First, move your Connection to be a instance variable so that it can be accessed from your open, close, and getMessage methods.

Next, create an openConnection method with the PostConstruct annotation.

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

Finally, create a closeConnection method with the PreDestroy annotation.

@PreDestroy
public void closeConnection() {
    connection.close();
}
泼猴你往哪里跑 2024-11-11 15:12:23

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

只需在 web.xml 中定义

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

,然后实现一个 servletContextListener

public final class contextListenerClassimplements ServletContextListener {
...
}

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

How about in the servlet context listener?

Just define in web.xml

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

And then implement a servletContextListener

public final class contextListenerClassimplements ServletContextListener {
...
}

Other solution can be to use SessionListener...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文