【问题标题】:Apache Qpid - Set routing key at message levelApache Qpid - 在消息级别设置路由键
【发布时间】:2012-02-29 15:44:01
【问题描述】:

是否有任何选项可以在 Apache Qpid 中的消息级别设置路由键。 我目前的做法是

  1. 在地址字符串中指定路由键。使用此目标地址创建生产者。

    topic = (Topic) context.lookup("destination"); 发件人 = session.createProducer(topic);

  2. 通过生产者发送消息。

这样所有消息都有相同的路由键。我想要实现的是为每条消息单独设置一个路由键。

让我知道这是否可以完成

【问题讨论】:

    标签: java jms messaging amqp qpid


    【解决方案1】:

    我第一次尝试这样做:

    Message message = session.createTextMessage("test");
    AMQMessageDelegate_0_10 delegate = (AMQMessageDelegate_0_10) ((AbstractJMSMessage)message).getDelegate();
    delegate.getDeliveryProperties().setRoutingKey("rk1");
    

    但是在发送消息时,它仍然具有在我的目的地中设置的路由键。

    查看 Qpid 的 Java 源代码,我不确定这目前是否可行。如果您查看https://svn.apache.org/repos/asf/qpid/trunk/qpid/java/client/src/main/java/org/apache/qpid/client/BasicMessageProducer_0_10.java,您会看到如下代码:

    String routingKey = destination.getRoutingKey().toString();
    if (deliveryProp.getRoutingKey() == null || ! deliveryProp.getRoutingKey().equals(routingKey))
    {
            deliveryProp.setRoutingKey(routingKey);
    }
    

    不幸的是,这似乎意味着即使您在消息上设置了路由键,如果消息的路由键与目的地的路由键不同,它也会被目的地的路由键替换。

    可能有一种方法可以做到这一点,但不幸的是,我对 Qpid 的 Java 方面并不十分熟悉。您最好的选择可能是在 Qpid 用户邮件列表中询问(有关信息,请参阅 http://qpid.apache.org/mailing_lists.html)。

    【讨论】:

      【解决方案2】:

      这可以通过指定每条消息的主题来轻松完成。 当使用 0-10 协议时,Qpid 地址方案定义的“主题”将映射到主题的路由键。

      Message m = ssn.createMessage();
      m.setStringProperty("qpid.subject", "my-subject");
      prod.send(m);
      

      这允许您在使用 Qpid 插件的同时使用标准 JMS 接口。

      【讨论】:

      • 我也可以在 Qpid 测试用例中找到一个支持测试用例。会尝试回来
      【解决方案3】:

      您可以将 setJMSReplyTo("address") 设置为路由键。 我已经用它来获得所需响应渠道的回复。

      【讨论】:

        【解决方案4】:

        您应该能够通过使用 AMQP 主题来实现您想要的。将 routingKey 设置为诸如“my-topic”之类的内容。按照设计将您的消费者设置为不同的主题,例如“subject-1”、“subject-2”、...

        对于生产者,他们每个人都可以发送具有不同主题的消息,例如“my-topic.subject-1”,“my-topic.subject-2”,......将它们用作生产者的routingKey。

        示例代码如下所示:

        //set up message consumer for "subject-1"
        AMQTopic topic-1 = new AMQTopic(new AMQShortString("amq.topic"), new AMQShortString("my-topic.subject-1), false, null, true);
        MessageConsumer consumer = session.createConsumer(topic-1);
        Message message = consumer.receive();
        ...
        
        //set up message producer for "subject-1"
        MessageProducer producer = session.createProducer(topic-1);
        producer.send(session.createTextMessage("my message"));
        

        通过这种方式,您还可以设置消费者来接收发送到“my-topic”的所有消息,同时使用“my-topic.*”作为其路由键。 在 Qpid 文档“Programming-In-Apache-Qpid”中查看更多详细信息

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-24
          • 1970-01-01
          • 1970-01-01
          • 2014-10-12
          • 2011-02-06
          • 1970-01-01
          相关资源
          最近更新 更多