消息侦听器中的JMS连接池

时间:2014-11-26 03:00:46

标签: java jms apache-commons-pool

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

流程处于异步模式,我们使用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如何处理它们被分配的连接。

谢谢。

1 个答案:

答案 0 :(得分:1)

这里的关键对象是会话而不是连接;会话将在这里进行主要工作,消息消耗(异步或其他)。

建议尝试尽可能广泛地分享连接。临时目标在连接级别上作用域。所以使用汇集是一个好主意;完全可以分享这种联系。

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