0

我正在尝试amq.fanout使用rabbitmq-cRabbitMQ 的 amqp 客户端创建类型交换。但是,我对我必须为它声明的确切内容感到困惑。根据这个,我必须声明交换名称和类型,以及可选的持久性和生命周期语义。

当我声明一个交换时,看起来我可以提供“交换”,我认为它是交换的名称,以及交换类型,例如amq.fanout。从examples/amqp_exchange_declare.c

amqp_exchange_declare(conn,
    1,
    amqp_cstring_bytes(exchange),
    amqp_cstring_bytes(exchangetype),
    0, 0, 0, 0, 
    amqp_empty_table);

但是,如果我看一个发布的例子,在第二个参数中,有一个地方提供交换类型exchange,它是命名的。例如,examples/amqp_producer.c

amqp_basic_publish(conn,
                                1,
                                amqp_cstring_bytes("amq.direct"),
                                amqp_cstring_bytes(queue_name),
                                0,
                                0,
                                NULL,
                                message_bytes)

但是没有地方提供交易所的名称。那么如何发布到命名交换?

为什么我要提供一个 queue_name 来发布?我应该只发布到交易所 - 队列应该对发布者隐藏。这只是示例中命名不佳的变量,还是我遗漏了一些基本的东西?

4

1 回答 1

4

查看文档,我看到第三个参数是要使用的交换。

int amqp_basic_publish   (   amqp_connection_state_t     state,
    amqp_channel_t  channel,
    amqp_bytes_t    exchange,
    amqp_bytes_t    routing_key,
    amqp_boolean_t  mandatory,
    amqp_boolean_t  immediate,
    struct amqp_basic_properties_t_ const *     properties,
    amqp_bytes_t    body 
)       

可能令人困惑的是在许多示例中使用“amq.direct”交换......这不是交换类型。相反,这是一个名为“amq.direct”的内置默认交换。它恰好是“直接”交换类型,但“amq.direct”是交换的名称,而不是类型。

起初,命名有点混乱……老实说,我花了将近一年的时间才弄清楚这一点。:)

简单示例通常执行“发布到队列”,在该示例中,您通过 amq.direct 交换推送消息,队列名称作为路由键。这会将消息直接发布到该队列。大多数情况下,这仅对演示或 RPC(请求/响应)场景有用,您需要将响应发布到特定的回复队列。

不久前,我写了一篇关于交换、队列和绑定之间关系的博客文章。它可能有助于消除一些混乱。

希望有帮助!

于 2015-08-24T18:15:45.510 回答