是否有任何选项可以在 Apache Qpid 的消息级别设置路由键。我目前做的方式是
在地址字符串中指定路由键。使用此目标地址创建一个生产者。
topic = (Topic) context.lookup("destination"); 发件人 = session.createProducer(topic);
通过生产者发送消息。
这样所有消息都具有相同的路由键。我想要实现的是为每条消息单独设置一个路由键。
让我知道这是否可以完成
这可以通过指定每个消息主题来轻松完成。当使用 0-10 协议时,Qpid 地址方案定义的“主题”将映射到主题的路由键。
Message m = ssn.createMessage();
m.setStringProperty("qpid.subject", "my-subject");
prod.send(m);
这允许您在使用 Qpid 附加组件的同时使用标准 JMS 接口。
我首先尝试这样做:
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)。
您可以将 setJMSReplyTo("address") 设置为路由键。我用它来获得所需响应渠道的回复。
您应该能够通过使用 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”