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