gpt4 book ai didi

java - JMS 多线程概念与 MQ

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:21 27 4
gpt4 key购买 nike

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

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

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

最佳答案

JMS 通过几个特性支持这一点:

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

关于java - JMS 多线程概念与 MQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11928620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com