JMS性能

Luk*_*der 20 java weblogic jms message-queue

从性能角度理解JMS我遇到了一些麻烦.我们在应用程序中有这么简单的代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

代码是正确的,但可能上面的一些人工制品可以重复用于几条消息.这些是我们的配置:

  • 我们使用Oracle Weblogic 10.3.3
  • Weblogic连接到JMS的IBM MQ 7.0(问题也出现在6.0)
  • 上述逻辑由后端服务器上的单个线程执行.这将是简单的将某些对象(QueueConnection,QueueSession,QueueSender因为没有涉及并发)在内存中.

我的问题

  • 哪些类型的对象可以在多个消息之间共享?(当然我们会包含错误恢复,恢复这些共享对象)
  • 什么是提高绩效的最佳做法?

Spa*_*ker 16

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

2.8节多线程

JMS Object          Supports Concurrent Use
Destination         YES
ConnectionFactory   YES
Connection          YES
Session             NO
MessageProducer     NO
MessageConsumer     NO
Run Code Online (Sandbox Code Playgroud)

第4.4.14节"客户端代码的串行执行"

除非客户端明确请求,否则JMS不会导致客户端代码的并发执行.这样做的一种方法是定义会话序列化所有异步消息传递

所以已经提到尽可能多地重用.重用所有线程的ConnectionFactory,Connection和Destinations.对于每个Thread重用消费者和生产者.

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


Hei*_*upp 10

你需要一次又一次地创建msg它本身 - 如果你发送到同一个队列.

所以是的,你可以记住Connection,Session和Sender.