2015-02-05 78 views
1

我正在使用rabbitmq-c库连接到RabbitMQ服务器(GNU/Linux构建环境)。Rabbitmq-c库:如何获得经纪人返回的'方法'

在我使用“amqp_channel_open(...)”时,我从我想调试的服务器收到错误。

根据示例,我称之为“amqp_get_rpc_reply(...)”。它返回一个amqp_rpc_reply_t,我将其分配给一个变量“my_reply”。

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

然而,here are the docsamqp_rpc_reply_t类型。

对于my_reply.reply:“在AMQP_RESPONSE_SERVER_EXCEPTION的情况下,本场将被设置为的方法,从经纪人返回”

所以my_reply.reply是amqp_method_t在这种情况下。但是当我查看amqp_method_t的文档时,它有两个字段:id(“method id number”,??)和解码为

对于解码,这是一个无效*: “指针解码的方法,转换为相应的类型使用”

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

[为清晰起见]

回答

2

我在这个例子中挖了一下,发现了一些有用的东西。

当my_reply.reply_type是AMQP_RESPONSE_SERVER_EXCEPTION,场my_reply.reply.id包含由宏在amqp_framing.h定义的AMQP_xxxxxx_METHOD常数之一 - see here and scroll down a bit

这些方法ID中的每一个都具有遵循相同命名约定的关联类型 - 例如,对于AMQP_CONNECTION_CLOSE_METHOD(我得到)有amqp_connection_close_tSee 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);