首页
学习
活动
专区
圈层
工具
发布

JMS性能
EN

Stack Overflow用户
提问于 2011-03-29 09:52:02
回答 3查看 9.6K关注 0票数 20

我在从性能角度理解JMS方面遇到了一些麻烦。我们的应用程序中有非常简单的代码:

代码语言:javascript
复制
QueueConnection connection = null;
QueueSession session = null;
QueueSender sender = null;
TextMessage msg = null;

try {
  // The JNDIHelper uses InitialContext to look up things
  QueueConnectionFactory qcf = JNDIHelper.lookupFactory();
  Queue destQueue = JNDIHelper.lookupQueue();

  // These objects are created for every message, which is quite slow
  connection = qcf.createQueueConnection();
  session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  sender = session.createSender(destQueue);

  // This is the actual message
  msg = session.createTextMessage(xmlMsg);
  sender.setTimeToLive(0);
  sender.send(msg);
} 
finally {

  // Close all objects again
  JMSUtilities.safeClose(sender);
  JMSUtilities.safeClose(session);
  JMSUtilities.safeClose(connection);
}

代码是正确的,但是上面的一些人工制品可能会被重用到几条消息中。这些是我们的配置:

  • 我们使用Oracle Weblogic 10.3.3
  • Weblogic连接到IBMMQ7.0(6.0中也出现问题)
  • 上述逻辑由后端服务器上的单个线程执行。将一些对象(QueueConnectionQueueSessionQueueSender)保存在内存中非常简单,因为不涉及并发性。

我的问题

  • 哪些类型的对象可以在多个消息之间共享?(当然,我们将包括错误恢复、还原那些共享对象)
  • 提高性能的最佳实践是什么?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-29 09:56:31

唯一需要一次又一次创建的是msg本身--如果您要发送到相同的队列。

所以是的,你可以记住连接,会话和发件人。

票数 10
EN

Stack Overflow用户

发布于 2013-09-05 07:21:01

下面是jms规范的一些相关部分

第2.8节多线程

代码语言:javascript
复制
JMS Object          Supports Concurrent Use
Destination         YES
ConnectionFactory   YES
Connection          YES
Session             NO
MessageProducer     NO
MessageConsumer     NO

4.4.14客户端代码的串行执行

JMS不会导致客户机代码的并发执行,除非客户机显式地请求它。这样做的一种方法是定义会话序列化所有异步消息传递。

因此,正如前面提到的,尽可能多地重用。重用所有线程的ConnectionFactory、连接和目的地。对于每个线程重用,消费者和生产者。

如果您正在重用JMS连接,请注意,JMS提供程序将在该连接上复用不同的会话。因此,即使重用连接是安全的,为您需要的每个会话创建一个连接也可能更快。

票数 16
EN

Stack Overflow用户

发布于 2011-03-29 11:21:11

定义了“共享”

如果您想在不同的线程之间共享,这是非常危险的。您可以安全地共享 QueueConnectionFactory对象以及JMS对象。不能使用共享会话、发件人/使用者或消息对象。这就是TIBCO的工作方式,我对IBM平台并不确定,但我想这是完全一样的。

如果您能够确保您的"send“方法没有被不同的线程调用,那么您可以将其封装到带有连接、会话和发件人成员变量的MySender类中。但小心点!在退出时正确关闭资源。这是海科·鲁普的建议。有些是这样的:

代码语言:javascript
复制
class MySender {
    private QueueConnection connection = null;
    private QueueSession session = null;
    private QueueSender sender = null;

    public MySender(...) { /* initialize conn/sess/sender */ }

    public send(String xmlMsg) { /* sender.send(session.createTextMessage(xmlMsg)) */ }

    public close() { /* close all resources */ }
}

关于业绩。JMS标准没有很大的改进余地。保持消息小,优化服务器设置。只有在需要时才使用持久的目的地,等等。阅读平台的文档。但在客户端,没有太多的空间。有些平台为JMS提供了额外的特性,允许一些额外的性能增益(批处理、发送等),但这取决于平台。我不认识IBM。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5470691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档