2012-02-08 38 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編程」