Как использовать amq.topic для публикации / подписки в Apache Qpid - PullRequest
1 голос
/ 21 сентября 2011

У меня есть издатель C ++ для отправки сообщений, подобных этому:

Connection connection;
connection.open("127.0.0.1", 5672);
Session session = connection.createSession();
Message msg;
msg.setData("TestAMsg");
msg.getDeliveryProperties().setRoutingKey("test.A");
session.messageTransfer(arg::content = message, 
                         arg::destination = "amq.topic");
msg.setData("TestBMsg");
msg.getDeliveryProperties().setRoutingKey("test.B");
session.messageTransfer(arg::content = message, 
                         arg::destination = "amq.topic");

И у меня есть такой подписчик Java:

AMQConnectionFactory connectionFactory = new 
                AMQConnectionFactory("amqp://guest:guest@myhost/test?
                                     brokerlist='tcp://127.0.0.1:5672'");
AMQConnection connection = (AMQConnection) 
                             connectionFactory.createConnection();
org.apache.qpid.jms.Session session = connection.createSession(false, 
                                             Session.AUTO_ACKNOWLEDGE);
AMQTopic destination = (AMQTopic) 
        AMQDestination.createDestination("topic://amq.topic//exclusive='false'?
                                          bindingkey='Test.A'");
MessageConsumer messageAConsumer = session.createConsumer(destination);
Message message_ = messageConsumer_.receive();

В приведенном выше коде нет сообщений.Я очень смущен, как это будет работать?Какова правильная форма привязки URL для потребителей?Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Ваш потребитель указывает ключ привязки, отличный от ключа маршрутизации, используемого производителем.

Код вашего производителя:

msg.getDeliveryProperties().setRoutingKey("test.A");

Ваш потребительский код:

AMQTopic destination = (AMQTopic) 
        AMQDestination.createDestination("topic://amq.topic//exclusive='false'?
                                          bindingkey='Test.A'");

Обратите внимание на разницу в регистре для первого символа каждой клавиши. Ваш производитель использует test.A, а ваш потребитель - Test.A, и поскольку ключи чувствительны к регистру, они считаются совершенно разными. Вот почему ваш продюсер не получит никаких сообщений.

0 голосов
/ 06 марта 2012

ключ привязки должен быть test. # Или test. *

разница между # и *, перейдите по этой ссылке http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_MRG/2/html/Messaging_User_Guide/chap-Messaging_User_Guide-Exchanges.html#sect-Messaging_User_Guide-Exchange_Types-Topic_Exchange

...