为来自同一队列的多个客户机配置JMS

为来自同一队列的多个客户机配置JMS,jms,Jms,因此,我有一个请求/响应队列,可以将消息放在上面,也可以从中读取消息 问题是,我有多个本地实例正在读取/馈送相同的队列,有时发生的情况是一个实例可以读取其他实例的回复消息 那么,有没有一种方法可以配置我的JMS,使用spring让实例读取它们只请求的消息,而不读取其他实例的消息呢 我对JMS和相关的东西知之甚少。因此,如果上面的问题需要更多的信息,那么我可以挖掘并提供它 谢谢很简单 JMS消息有两个可以使用的属性—JMSMessageID和JMSCOrrationId JMSMessageId对

因此,我有一个请求/响应队列,可以将消息放在上面,也可以从中读取消息

问题是,我有多个本地实例正在读取/馈送相同的队列,有时发生的情况是一个实例可以读取其他实例的回复消息

那么,有没有一种方法可以配置我的JMS,使用spring让实例读取它们只请求的消息,而不读取其他实例的消息呢

我对JMS和相关的东西知之甚少。因此,如果上面的问题需要更多的信息,那么我可以挖掘并提供它

谢谢

很简单

JMS消息有两个可以使用的属性—JMSMessageID和JMSCOrrationId

JMSMessageId对于每条消息都应该是唯一的,因此您可以执行以下操作:

让客户端发送请求,然后开始侦听相关id=已发送消息id的响应。然后,服务器端负责将请求的消息id复制到响应的相关id。类似于:
responseMsg.setJMSCorrelationID(requestMsg.getJMSMessageID())

客户端代码示例:

Session session = getSession();
Message msg = createRequest();
MessageProducer mp = session.createProducer(session.createQueue("REQUEST.QUEUE"));
mp.send(msg,DeliveryMode.NON_PERSISTENT,0,TIMEOUT);
// If session is transactional - commit now. 
String msgID = msg.getJMSMessageID();

MessageConsumer mc = session.createConsumer(session.createQueue("REPLY.QUEUE"),
                                            "JMSCorrelationID='" + msgId + "'");
Message response = mc.receive(TIMEOUT);

一个更高效的解决方案是在每个目的地使用专用的应答队列。只需将
message.setJMSReplyTo(session.createQueue(“REPLY.QUEUE.”+getInstanceId())
并确保服务器端将响应发送到
requestMsg.getJMSReplyTo()
而不是硬编码的值。

您可能想看看这个:。@Shashi这似乎是我想做的事情。但是由于我对jms和相关的东西不太了解,如果我想知道整个东西是如何工作的,你能告诉我我应该用谷歌搜索什么吗。比如,如果我想添加相关ID,或者如何读取具有特定相关ID的消息,以及如何知道请求应用程序将放置什么相关ID。还有一件事,我想根据环境来做。例如,对于本地开发,我想这样做,但其他环境说,生产我不想。有什么想法吗?我在这里添加了示例: