【问题标题】:Configure JMS for multiple clients feeding off same queue为多个客户端配置 JMS 以馈送同一队列
【发布时间】:2014-08-03 16:23:15
【问题描述】:

所以我有请求/响应队列,我将消息放入并从中读取消息。

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

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

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

谢谢

【问题讨论】:

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

标签: jms


【解决方案1】:

很简单!

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() 而不是硬编码值。

【讨论】:

    猜你喜欢
    • 2015-06-03
    • 2020-03-04
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多