【问题标题】:JMS Connection Pooling in Message Listener消息侦听器中的 JMS 连接池
【发布时间】:2014-11-26 03:00:45
【问题描述】:

目前我正在开发一个独立的 Java 应用程序,该应用程序连接到 Websphere MQ 以发送和接收消息。

流程处于异步模式,我们使用MessageListener 类实现,以便在消息准备好时从队列中检索消息。使用监听器初始化消费者的代码如下:

if(connection == null)
        connection = getJmsConnection();

    try {
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        if (isTopic) {
            destination = session.createTopic(destinationName);
        } else {
            destination = session.createQueue(destinationName);
        }
        consumer = session.createConsumer(destination);
        consumer.setMessageListener(listener);
    } catch (JMSException e) {
        e.printStackTrace();
    }

getJmsConnection() 方法将从池中返回一个连接,使用 Apache Commons Pool 库实现。

我的问题是,只要程序正在运行,从池中分配给侦听器的连接是否会处于活动状态并与该侦听器绑定?或者连接被间歇性使用并且可以被其他进程重用?我们的想法是让发送和接收过程重用池中的连接,但我不确定MessageListener 如何处理分配给它们的连接。

谢谢。

【问题讨论】:

    标签: java jms apache-commons-pool


    【解决方案1】:

    这里的关键对象是会话而不是连接;该会话将在此处使用消息消费(异步或其他方式)进行主要工作。

    建议尽可能广泛地尝试和共享连接。临时目标的范围在连接级别。所以使用池化是个好主意;完全有可能分享这种联系。

    但是我还要说,可能值得考虑合并会话。使用此处的代码将创建一个新会话,每次通过该代码,这意味着将创建一个到 WebSphere MQ 队列管理器的新连接。目前尚不清楚这将是什么范围,但如果迅速关闭它可能会成为瓶颈。

    【讨论】:

    • 感谢您的回复。我不太确定会话池是如何完成的,将尝试了解更多信息。
    • 会话池将以与连接池非常相似的方式完成。关键是要确保在任何时候只有 1 个线程使用会话。
    • 这意味着我们将有 2 个池?一个用于连接,一个用于会话。
    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    相关资源
    最近更新 更多