Apache Qpid - 在消息级别设置路由密钥

时间:2012-02-08 07:36:51

标签: java jms messaging amqp qpid

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

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

    topic =(主题)context.lookup(“destination”); sender = session.createProducer(topic);

  2. 通过制作人发送消息。

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

    让我知道是否可以这样做

4 个答案:

答案 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”

中的更多详细信息