java - 消息监听器中的 JMS 连接池

标签 java jms apache-commons-pool

目前我正在开发一个独立的 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 库实现的。

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

谢谢。

最佳答案

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

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

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

关于java - 消息监听器中的 JMS 连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27140595/

相关文章:

java - 如何避免 Hibernate ValidationException 上的自动实体更新

java - 服务器重启后将消息保留在主题中

java - 为什么当我使用 Apache-Commons-Pool 时线程会被阻塞?

java - 如何跳过java字符串数组中的3个元素并获取接下来的3个元素

java - 为什么Java中可以实例化嵌套静态类,而C#中却不能实例化。静态的定义不同吗?

java - 如何使用 IP 过滤器保护 Orbeon Form Runner 的安全?

php - JmsI18NBundle - 必须设置翻译所在的目录

jms - Apama JMS Correlator Adapter 动态流控制

concurrency - Redis 出队时处于 'parking to wait' 状态的线程

java - 即使使用close关闭spring上下文,为数据库连接创建的TimerThreads仍继续运行