【问题标题】:Long lived JMS sessions. Is Keeping JMS connections / JMS sessions always opened a bad practice?长寿的 JMS 会话。保持 JMS 连接/JMS 会话是否总是一种不好的做法?
【发布时间】:2010-09-21 09:41:08
【问题描述】:

保持 JMS 连接/会话/消费者总是打开一个不好的做法吗?

代码草稿示例:

// app startup code

ConnectionFactory cf = (ConnectionFactory)jndiContext.lookup(CF_JNDI_NAME);
Connection connection = cf.createConnection(user,pass);
Session session = connection.createSession(true,Session.TRANSACTIONAL);
MessageConsumer consumer = session.createConsumer(new Queue(queueName));
consumer.setMessageListener(new MyListener()); 
connection.start();
connection.setExceptionListener(new MyExceptionHandler()); // handle connection error


// ... Message are processed on MyListener asynchronously ...


// app shutdown code

consumer.close();
session.close();
connection.close();

对改进这种 JMS 使用模式有什么建议吗?

【问题讨论】:

    标签: java jms


    【解决方案1】:

    在处理长期连接时,这是一种非常普遍且可接受的做法。实际上,对于许多 JMS 服务器来说,每次需要时都创建一个新连接更可取。

    【讨论】:

      【解决方案2】:

      同意。这里有一些good tips on how to use JMS efficiently,其中包括保持连接/会话/生产者/消费者。

      如果您有兴趣最大限度地提高性能,您可能还想查看recommendation on using transactions

      【讨论】:

        【解决方案3】:

        在我们的应用中,我们将有几个月的连接/会话/消费者/生产者开放。我们不得不与我们的供应商 (BEA) 合作,以使这项工作可靠。但任何与此相关的问题都是供应商需要修复的错误。

        【讨论】:

          【解决方案4】:

          选择是否保持连接/会话/生产者/消费者长时间打开应基于生产者/消费者发送/接收消息的频率。

          如果生产者发送或消费者频繁接收消息,则连接/会话/生产者/消费者应保持打开状态。另一方面,如果消息发送/接收不频繁,那么让这些 JMS 对象保持打开状态将消耗系统资源(如套接字)是不好的。

          【讨论】:

            【解决方案5】:

            仅供参考,没有必要关闭已关闭连接的会话、生产者和消费者(javax.jms.Connection)。 下面的代码应该足以释放资源:

            try { 
                    this.connection.close();
                } catch (JMSException e) {
                    //
                }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-07-17
              • 2012-07-03
              • 2011-02-10
              • 1970-01-01
              • 2017-11-06
              • 1970-01-01
              • 2021-05-23
              • 2015-07-23
              相关资源
              最近更新 更多