AMQP:Exchange,队列和路由密钥以及绑定密钥:声明和引用已命名的交换

时间:2015-08-24 17:41:50

标签: amqp rabbitmq-c

我正在尝试使用amq.fanout(RabbitMQ的amqp客户端)创建类型rabbitmq-c的交换。但是,我正在惹恼我必须申报的内容。根据{{​​3}},我必须为交换声明交换名称和类型,以及可选的持久性和生命周期语义。

当我宣布交换时,看起来我可以提供'交换',我认为是交换的名称,以及交换类型 ,例如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的第二个参数中提供交换 type 。例如,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来发布呢?我应该只发布到交易所 - 队列应该是隐藏在发布者之外的。这些都是示例中命名不佳的变量,还是我遗漏了一些基本的东西?

1 个答案:

答案 0 :(得分:3)

looking at the docs我看到第3个参数是要使用的交换。

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(请求/响应)场景,您需要将响应发布到特定的回复队列。

我曾经写过a blog post on the relationships between exchanges, queues and bindings一段时间。它可能有助于消除一些混乱。

希望有所帮助!

相关问题