JMS支持此与一对夫妇的特征:
首先,JMSCorrelationId是JMS头,其用于与相关联的响应的请求。即每条消息都包含一个全局唯一的(GUUID)JMSMessageId。大型机应用程序应简单地将请求中的消息ID复制到响应消息中的JMSCorrelationId并发送回共享响应队列。
所以,只需发送一个请求:
(psuedo code - in one thread, do the following when you need to request data over JMS)
myMessage = session.createTextMessage("My nice request");
messageProducer.send(myMessage); // using some previously setup producer
// commit if needed
mc = session.createConsumer(queue,"JMSCorrelationId='"+myMessage.getMessageId()+"'");
responseMessage = mc.receive(TIMEOUT);
if(responseMessage != null){
//got OUR response data
}
// close down consumer here.
诀窍允许多个消费者线程(或应用)是在消费者的选择。 JMS选择器类似于SQL或类似查询语言的子集。在这种情况下,只需选择JMSCorrelationId与请求发送一段时间后的ID相同的消息。
这是唯一的“安全”设置,您可以对这个设置进行限制,即您拥有一个固定的共享队列,并且请求必须返回到请求的同一个线程。
为避免JMS选择器的开销,您可以使用临时队列作为回复,每个请求使用一个临时队列,那么就不会有其他线程监听特定的响应。获得性能的另一个选择是使应用程序更加异步。 JMS实际上提出了这个问题,引发了一个请求,并让一组消费者线程处理任何异步响应 - 每个线程同样能够处理任何响应,例如处理数据并将其放入数据库(或类似数据库)中。我不知道这个设计范例是否适用于您的案例,但您至少应该知道它。
也许你想阅读这个http://docs.oracle.com/javaee/5/tutorial/doc/bncdx.html或这个http://my.execpc.com/~gopalan/jms/jms.html真的没有必要用其他一些词来解释文档。他们有非常好的原理图解释它是如何工作的。阅读关于ptp和psm消息类型,它会让你在那里。谢谢。 – 2012-08-13 09:07:40