【问题标题】:How to send Message to particular Receiver using JMS Queue如何使用 JMS 队列将消息发送到特定接收器
【发布时间】:2011-09-07 14:47:24
【问题描述】:

是否可以使用 JMS Queue(HornetQ) 向特定接收者发送消息?

在这么多接收者中,我希望接收者接收到某些消息 在 Linux 操作系统上运行。

每条建议都得到认可。

谢谢。

【问题讨论】:

    标签: java jakarta-ee jms hornetq


    【解决方案1】:

    您可以使用Message.setObjectProperty(String, Object) 设置消息属性,然后让您的消费者使用Session.createConsumer(Destination, String) 选择他们感兴趣的消息

    发件人示例:

    Message message = session.createMessage();
    message.setObjectProperty("OS", "LINUX");
    producer.send(message);
    

    接收者示例:

    MessageConsumer consumer = session.createConsumer(destination, "OS = 'LINUX'");
    //Use consumer to receive messages.
    

    示例中的接收器将忽略(它们将转到其他接收器)所有与选择器不匹配的消息。在这种情况下,所有“OS”属性不是“LINUX”的消息都会被这个消费者忽略。

    【讨论】:

    • 以上是如何解决问题的?更改上述内容后我遇到了问题?
    • 尽管这并不能真正解决问题,但它是对创建 JMS 消费者的一个很好的洞察。感谢分享!
    【解决方案2】:

    您可以设置JMS消息的属性:http://download.oracle.com/javaee/1.4/api/javax/jms/TextMessage.html并在客户端过滤消息。 例如, message.setStringProperty("TARGET_OS", "LINUX") - 在发件人 http://www.mkyong.com/java/how-to-detect-os-in-java-systemgetpropertyosname/ - 检测接收器的操作系统并使用正确的 TARGET_OS 属性过滤消息

    【讨论】:

    • 感谢您的回复,您能详细说明一下吗?,现在我可以正常发送消息了,但是我该如何接收呢?或者我需要在哪里设置 Receiver 端的属性?
    • 您可以检查接收方的属性,如果接收方不感兴趣,则忽略消息。或者,如果您的 JMS 实现支持,您可以使用 JMS 选择器:download.oracle.com/javaee/1.4/tutorial/doc/JMS4.html
    【解决方案3】:

    您可以在消费者端使用 JMS 选择器来查找符合特定条件的消息。

    【讨论】:

      【解决方案4】:

      不确定我是否遗漏了什么,您可以通过拥有多个队列来保持简单 - 特定于每个平台,然后基于 linux 的消费者可以单独收听 linux 特定队列。现在您的挑战可能是将消息从生产者端路由到适当的队列,如果路由基于消息的某些属性,那应该相当容易?

      【讨论】:

      • 感谢您的回复,但实际上我不应该根据要求为此创建新队列。