1

我有一个 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 形式是什么?我错过了什么?

4

2 回答 2

2

您的消费者指定一个与生产者使用的路由密钥不同的绑定密钥。

您的生产者代码:

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

您的消费者代码:

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

请注意每个键的第一个字符的大小写差异。您的生产者使用test.A和消费者使用Test.A,并且由于键是区分大小写的,因此它们被认为是完全不同的。这就是为什么您的生产者不会收到任何消息的原因。

于 2011-09-26T12:20:04.900 回答
0

您的绑定密钥应该是 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

于 2012-03-06T08:05:13.167 回答