如何通过主题交换使用fe 2 o3-amqp和RabbitMQ交换AMQP 1.0消息

xoefb8l8  于 2023-02-19  发布在  RabbitMQ
关注(0)|答案(1)|浏览(297)

我尝试使用fe2o3-amqp crate(Rust)通过配置了AMQP 1.0协议的RabbitMQ代理接收和发送消息。
如何配置ConnectionSessionSender/Receiver以发布/订阅主题交换?
这是我目前所做的工作,对于RabbitMQ中的主题交换,我配置了一个Exchange(名称为MyExchange,持久,类型:主题)、队列(名为MyQueue,类型:经典、耐用),以及具有路由密钥my.topic的从MyExchangeMyQueue的绑定。
在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。任何其他队列名称都只是创建一个新队列。
那么,如何指定交换机和路由呢?
比尔。

z31licg0

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代理中,交换的过滤器必须配置为将消息路由到相应的队列。最后但并非最不重要的是,用户权限也必须配置为授予对该主题的访问权限。

// "test.topic"
let sender = Sender::attach(&mut session, "amq_topic_sender", "/exchange/my_exchange/my.topic").await.unwrap();
let receiver = Receiver::attach(&mut session, "amq_topic_receiver", "/exchange/my_exchange/my.topic").await.unwrap();

相关问题