我正在尝试使用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来发布呢?我应该只发布到交易所 - 队列应该是隐藏在发布者之外的。这些都是示例中命名不佳的变量,还是我遗漏了一些基本的东西?
答案 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一段时间。它可能有助于消除一些混乱。 希望有所帮助!