我尝试使用fe2o3-amqp crate(Rust)通过配置了AMQP 1.0协议的RabbitMQ代理接收和发送消息。
如何配置Connection
、Session
和Sender
/Receiver
以发布/订阅主题交换?
这是我目前所做的工作,对于RabbitMQ中的主题交换,我配置了一个Exchange(名称为MyExchange
,持久,类型:主题)、队列(名为MyQueue
,类型:经典、耐用),以及具有路由密钥my.topic
的从MyExchange
到MyQueue
的绑定。
在Python 3.9.2中,我可以使用pika的Python脚本将消息发送到my.topic
,这些消息可以在MyQueue
中排队查看。我不确定pika在这里使用的是AMQP 1.0版本,但至少它确认了交换路由队列正在工作。python中的相关部分如下所示,其余部分只是粘合(简单地创建通道和连接):
channel.basic_publish(exchange='MyExchange', routing_key='my.topic', body='Hello topic!')
文档中的大多数示例都是这样做的,只是示例不使用Sender::builder()
:
let mut connection = create_connection(
"a-sender",
"blah-blah",
).await?;
let session = Session::begin(&mut connection).await?;
let sender = Sender::builder()
.name("rust-sender-link-1")
.target("some-queue-name")
.attach(&mut session)
.await
.unwrap();
如果我使用MyQueue
作为"my.topic"
,则会失败,错误代码为SenderAttachError
。任何其他队列名称都只是创建一个新队列。
那么,如何指定交换机和路由呢?
比尔。
1条答案
按热度按时间z31licg01#
感谢fe2o3-amqp crate的作者@minghua-wu在github上的project's page中及时提供了有用的评论。
有一个很有帮助的问题,是在这里张贴了一段时间,Unable to get Topic Exchange to Work in RabbitMQ AMQP 1.0。
用于将发送方/接收方附加到会话的目标名称必须包括路由根
/exchange/my.topic
,以明确指示主题将与特定的exchange-topic相关。否则,附加将失败,或者将发生到代理的默认主题交换,并且消息将被发送到另一个队列。在此之前,在RabbitMQ代理中,交换的过滤器必须配置为将消息路由到相应的队列。最后但并非最不重要的是,用户权限也必须配置为授予对该主题的访问权限。