Java 使用MQ的JMS多线程概念

Java 使用MQ的JMS多线程概念,java,jakarta-ee,queue,jms,messaging,Java,Jakarta Ee,Queue,Jms,Messaging,我最近开始学习JMS,到目前为止理解了其中的一些概念。不过,我想知道IBM MQ或任何队列提供程序如何处理来自多线程应用程序的请求。比如说 考虑一个多线程的应用程序,它被配置为使用MQ向大型机主机发送消息。此应用程序配置了一个Put队列和get队列。假设正在处理10个请求,每个请求都希望从主机获取数据。由于队列仅为一个,因此所有这10条消息都同时放置在队列中。主机处理这些消息并向客户端(即应用程序)发送回复。如何使回复消息不被混淆,并且每个线程都获得自己的正确回复消息 通信时使用了一些id,它是

我最近开始学习JMS,到目前为止理解了其中的一些概念。不过,我想知道IBM MQ或任何队列提供程序如何处理来自多线程应用程序的请求。比如说

考虑一个多线程的应用程序,它被配置为使用MQ向大型机主机发送消息。此应用程序配置了一个Put队列和get队列。假设正在处理10个请求,每个请求都希望从主机获取数据。由于队列仅为一个,因此所有这10条消息都同时放置在队列中。主机处理这些消息并向客户端(即应用程序)发送回复。如何使回复消息不被混淆,并且每个线程都获得自己的正确回复消息


通信时使用了一些id,它是否特定于发送的消息的特定线程?是否需要为每个新的执行线程建立JMS会话。?对所有10个请求使用相同的会话是什么?非常感谢您提供详细解释此概念的示例或链接。

JMS通过以下几个功能支持此功能:

首先,JMSCorrelationId是一个JMS头,用于将请求与响应关联起来。即,每条消息都包含一个全局唯一(GUID)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实际上促进了这一点,发出了一个请求,并让一个消费线程池处理任何异步响应——每个线程都同样能够处理任何响应——usch处理数据并将其放入数据库(或类似数据库)。我不知道这种设计模式是否适用于您的案例,但您至少应该了解它。

也许您想阅读这篇或这篇文章,实际上没有必要用其他词语解释文档。他们有很好的示意图来解释它是如何工作的。阅读有关ptp和psm消息类型的信息,您将了解这些信息。谢谢