所以我有请求/响应队列,我正在发送消息并从中读取消息。
问题是我有多个本地实例正在读取/取消相同的队列,有时会发生一个实例可以读取其他实例的回复消息。
有没有一种方法可以配置我的JMS,使用spring实际上使实例读取仅由它们请求的消息而不读取其他实例的消息。
我对JMS及相关内容知之甚少。因此,如果上述问题需要更多信息,那么我可以挖掘并提供它。
由于
答案 0 :(得分:2)
这很简单!
JMS消息有两个可以使用的属性 - JMSMessageID和JMSCorrelationID。
对于每条消息,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()
发送响应,而不是硬编码值。