Rabbitmq-c Library:如何获取代理返回的'method'

时间:2015-02-05 21:36:13

标签: c rabbitmq amqp

我使用rabbitmq-c库连接到RabbitMQ服务器(GNU / Linux构建环境)。

当我使用" amqp_channel_open(...)"时,我从我想要调试的服务器收到错误。

我打电话给" amqp_get_rpc_reply(...)"按照例子。它返回 amqp_rpc_reply_t ,我将其分配给变量" my_reply"。

my_reply.reply_type 是AMQP_RESPONSE_SERVER_EXCEPTION,这就是为什么我认为它是来自服务器的错误。

然而,here are the docs代表 amqp_rpc_reply_t 类型。

对于my_reply.reply:"在AMQP_RESPONSE_SERVER_EXCEPTION的情况下,此字段将设置为从代理返回的方法"

所以my_reply.reply在这种情况下是 amqp_method_t 。但是当我查看amqp_method_t的文档时,它有两个字段: id (&#34;方法ID号&#34;,??)和已解码。< / p>

对于已解码,它是 void * :  &#34;指向解码方法的指针,转换为适当的类型以使用&#34;

我被困在这一点上,因为我不知道要将**解码*转换为什么。它应该是某种包含服务器返回的信息的数据结构(AMQP方法),但我找不到任何类型的引用。

[为清晰起见编辑]

1 个答案:

答案 0 :(得分:2)

我在示例中挖了一些,发现了一些有用的东西。

当my_reply.reply_type为 AMQP_RESPONSE_SERVER_EXCEPTION 时,字段my_reply.reply.id包含 AMQP_xxxxxx_METHOD 常量之一,由 amqp_framing.h中的宏定义< / strong> - see here and scroll down a bit

这些方法ID中的每一个都具有遵循相同命名约定的关联类型 - 例如,对于 AMQP_CONNECTION_CLOSE_METHOD (我得到的)有 amqp_connection_close_t See here for a list of data structures / types

知道要将 my_reply.reply.decoded 投射到哪种类型,然后很容易提取有用信息 - 例如(例如,假设my_reply.reply.id是AMQP_CONNECTION_CLOSE_METHOD):

amqp_connection_close_t *m = (amqp_connection_close_t *)my_reply.reply.decoded;
printf( "Server connection error %d, message: %.*s\n",
               m->reply_code,
         (int) m->reply_text.len,
      (char *) m->reply_text.bytes);