0

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

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

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

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

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

让我知道这是否可以完成

4

4 回答 4

2

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

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

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

于 2012-02-13T17:00:45.477 回答
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)。

于 2012-02-11T12:29:35.923 回答
0

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

于 2012-06-08T08:56:42.577 回答
0

您应该能够通过使用 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”

于 2013-10-11T15:13:27.753 回答