2012-08-13 99 views
2

我最近开始学习JMS,并了解了一些概念。不过,我想知道IBM MQ或任何队列提供程序如何处理来自多线程应用程序的请求。例如JMS多线程概念与MQ

考虑一个应用程序,该应用程序被mutithreaded并配置为使用MQ将消息发送到大型机主机。该应用程序有一个Put队列并配置了队列。想象一下,每个要处理的请求都需要从主机获取数据。由于队列只有一个,所有这10条消息都同时放入队列中。主机处理这些消息并将该答复发送给客户端,即应用程序。答复消息如何不混淆,每个线程都得到自己正确的答复消息?

某些id在通信时使用,是特定于发送的特定线程的消息吗?是否需要为每个新的执行线程建立JMS会话?所有10个请求都使用同一会话吗?希望能够详细解释这一概念的任何示例或链接。

+1

也许你想阅读这个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

回答

3

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实际上提出了这个问题,引发了一个请求,并让一组消费者线程处理任何异步响应 - 每个线程同样能够处理任何响应,例如处理数据并将其放入数据库(或类似数据库)中。我不知道这个设计范例是否适用于您的案例,但您至少应该知道它。