2012-02-08 33 views
0

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

  1. 在地址字符串中指定路由键。用这个目的地址创建一个制作人。

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

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

这样所有的消息都有相同的路由密钥。我想实现的是为每个消息分别设置一个路由键。

让我知道这是可以做到

回答

2

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

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

这使您可以使用标准的JMS接口,同时仍然使用Qpid附加组件。

+0

我也可以在Qpid测试用例中找到支持测试用例。将尝试并回来 – ManojGumber 2012-02-15 05:27:21

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)。

0

您可以将setJMSReplyTo(“address”)设置为路由密钥。 我用它在需要的响应频道上获得回复。

0

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

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

示例代码如下所示:

//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")); 

这样你也可以建立一个消费者接收所有发送到“我的话题”的消息,以及使用“我的话题*。 “作为其路由键。 在Qpid文档中查看更多详细信息,请参见“Apache-Qpid编程”