我在从性能角度理解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);
}代码是正确的,但是上面的一些人工制品可能会被重用到几条消息中。这些是我们的配置:
QueueConnection、QueueSession、QueueSender)保存在内存中非常简单,因为不涉及并发性。我的问题
发布于 2011-03-29 09:56:31
唯一需要一次又一次创建的是msg本身--如果您要发送到相同的队列。
所以是的,你可以记住连接,会话和发件人。
发布于 2013-09-05 07:21:01
下面是jms规范的一些相关部分
第2.8节多线程
JMS Object Supports Concurrent Use
Destination YES
ConnectionFactory YES
Connection YES
Session NO
MessageProducer NO
MessageConsumer NO4.4.14客户端代码的串行执行
JMS不会导致客户机代码的并发执行,除非客户机显式地请求它。这样做的一种方法是定义会话序列化所有异步消息传递。
因此,正如前面提到的,尽可能多地重用。重用所有线程的ConnectionFactory、连接和目的地。对于每个线程重用,消费者和生产者。
如果您正在重用JMS连接,请注意,JMS提供程序将在该连接上复用不同的会话。因此,即使重用连接是安全的,为您需要的每个会话创建一个连接也可能更快。
发布于 2011-03-29 11:21:11
定义了“共享”。
如果您想在不同的线程之间共享,这是非常危险的。您可以安全地共享 QueueConnectionFactory对象以及JMS对象。不能使用共享会话、发件人/使用者或消息对象。这就是TIBCO的工作方式,我对IBM平台并不确定,但我想这是完全一样的。
如果您能够确保您的"send“方法没有被不同的线程调用,那么您可以将其封装到带有连接、会话和发件人成员变量的MySender类中。但小心点!在退出时正确关闭资源。这是海科·鲁普的建议。有些是这样的:
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。
https://stackoverflow.com/questions/5470691
复制相似问题