有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有MQ的java JMS多线程概念

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

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

通信时使用了一些id,它是否特定于发送的特定消息线程?是否需要为每个新的执行线程建立JMS会话。?对于所有10个请求,使用相同的会话是什么?如果有任何例子或链接能详细解释这个概念,我们将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    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处理数据并将其放入数据库(或类似数据库)。我不知道这种设计模式是否适用于你的案例,但你至少应该意识到这一点