第 14 章 临时队列和运行时队列
在设计一个请求reply 模式时,客户端发送请求并等待回复时,您必须考虑客户端的每个运行时实例是为其回复需要一个专用队列,或者运行时实例是否可以访问共享队列,根据适当的属性选择其特定的回复消息。
如果需要多个队列,客户端需要能够动态创建队列。JMS 利用临时队列的概念提供这一功能。Session 根据要求创建一个 TemporaryQueue。它在连接的生命周期内存在 , 例如,连接关闭或临时队列被删除为止。这意味着,尽管临时队列由特定的会话创建,但它可以被从同一连接创建的任何其他会话重复利用。
使用共享队列和回复个别临时队列之间的权衡受活动客户端实例数量的影响。采用共享队列方法时,在某些特定于提供商的阈值上,对队列访问的争用可能会成为问题。这必须与提供商在运行时创建队列存储相关的额外开销以及托管大量临时队列的计算机内存影响进行对比。
以下示例在启动时为每个客户端创建一个临时队列和使用者。它将每条消息上的 JMSReplyTo 属性设置为临时队列,然后在每条消息上设置关联 ID,以将请求消息与响应消息相关联。这可避免为每个请求创建和关闭消费者的开销,而这非常昂贵。相同的生产者和消费者可以在多个线程之间共享或共用。在消费者下次访问队列时,收到的任何消息(在会话终止时尚未确认)都会保留并重新传送。
示例:临时队列代码
...
// Create a temporary queue, one per client
Destination temporaryQueue = session.createTemporaryQueue();
MessageConsumer responseConsumer = session.createConsumer(temporaryQueue);
// This class handles messages to the temporary queue
responseConsumer.setMessageListener(this);
// Create the message to send
TextMessage textMessage = session.createTextMessage();
textMessage.setText("My new message!");
// Set the reply to field and correlation ID
textMessage.setJMSReplyTo(temporaryQueue);
textMessage.setJMSCorrelationID(myCorrelationID);
producer.send(textMessage);
...
类似地,使用 Session.createTemporaryTopic() 方法创建临时主题。