10

保持 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 使用模式吗?

4

5 回答 5

8

同意。这里有一些关于如何有效使用 JMS 的好技巧,包括保持连接/会话/生产者/消费者。

如果您对最大化性能感兴趣,您可能还想查看有关使用事务的建议。

于 2008-11-10T10:51:29.843 回答
6

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

于 2008-11-08T02:01:56.653 回答
5

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

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

于 2012-05-30T03:42:38.030 回答
4

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

于 2008-11-10T21:46:24.033 回答
2

FYI, there is no need to close the sessions, producers, and consumers of a closed connection( javax.jms.Connection ). The code below should be enough to release the resources:

try { 
        this.connection.close();
    } catch (JMSException e) {
        //
    }
于 2016-10-24T11:34:01.867 回答