使用Rabbitmq-c以编程方式声明具有x-max-length的队列

xfyts7mz  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(152)

我正在为我的C应用程序实现一个RPC函数,并尝试以编程方式声明一个队列,以限制挂起消息的最大数量。在阅读了amqp.hamqp_table_entry_tamqp_field_value_t的声明之后,下面是我的最小代码示例:

int default_channel_id = 1;
int passive = 0;
int durable = 1;
int exclusive = 0;
int auto_delete = 0;

amqp_table_entry_t  *q_arg_n_elms = malloc(sizeof(amqp_table_entry_t));

* q_arg_n_elms = (amqp_table_entry_t) {.key = amqp_cstring_bytes("x-max-length"),

             .value = {.kind = AMQP_FIELD_KIND_U32, .value = {.u32 = 234 }}};

amqp_table_t  q_arg_table = {.num_entries=1, .entries=q_arg_n_elms};

amqp_queue_declare( conn, default_channel_id, amqp_cstring_bytes("my_queue_123"),
                passive, durable, exclusive, auto_delete, q_arg_table );
amqp_rpc_reply_t   _reply = amqp_get_rpc_reply(conn);

上面的代码总是在amqp_rpc_reply_t的对象中返回AMQP_RESPONSE_LIBRARY_EXCEPTION,并返回错误消息a socket error occurred,我在RabbitMQ的Web管理UI中没有看到任何由该代码触发的活动连接。因此我认为rabbitmq-c库没有建立连接,只是回复错误。
然而,当我用默认的amqp_empty_table(这意味着没有参数)替换参数q_arg_table时,一切都运行得很好。
以下是我的问题:

  • 我在哪里可以找到过滤队列参数的无效键的代码?根据本文,x-max-length应该是限制队列中消息数量的正确参数键,但我不明白为什么库仍然报告错误。
  • 是否有示例演示如何正确设置amqp_table_t传入amqp_queue_declare(...)

开发环境:

  • RabbitMQ 3.2.4版
  • 家兔mq-c版本0.11.0

感谢您的反馈,感谢您的阅读。
[编辑]
根据服务器日志rabbit@myhostname-sasl.log,RabbitMQ代理接受了一个新连接,发现接收帧时解码错误,然后立即关闭连接。我还没有弄清楚Erlang实现,但根本原因可能是声明队列时表参数上的解码错误。

131 =CRASH REPORT==== 18-May-2022::16:05:46 ===
132   crasher:
133     initial call: rabbit_reader:init/2
134     pid: <0.23706.1>
135     registered_name: []                                                                                                                      
136     exception error: no function clause matching 
137                      rabbit_binary_parser:parse_field_value(<<105,0,0,1,44>>) (src/rabbit_binary_parser.erl, line 53)
138       in function  rabbit_binary_parser:parse_table/1 (src/rabbit_binary_parser.erl, line 44)
139       in call from rabbit_framing_amqp_0_9_1:decode_method_fields/2 (src/rabbit_framing_amqp_0_9_1.erl, line 791)
140       in call from rabbit_command_assembler:process/2 (src/rabbit_command_assembler.erl, line 85)
141       in call from rabbit_reader:process_frame/3 (src/rabbit_reader.erl, line 688)
142       in call from rabbit_reader:handle_input/3 (src/rabbit_reader.erl, line 738)
143       in call from rabbit_reader:recvloop/2 (src/rabbit_reader.erl, line 292)
144       in call from rabbit_reader:run/1 (src/rabbit_reader.erl, line 273)
145     ancestors: [<0.23704.1>,rabbit_tcp_client_sup,rabbit_sup,<0.145.0>]
146     messages: [{'EXIT',#Port<0.31561>,normal}]
147     links: [<0.23704.1>]
148     dictionary: [{{channel,1},
149                    {<0.23720.1>,{method,rabbit_framing_amqp_0_9_1}}},
150                   {{ch_pid,<0.23720.1>},{1,#Ref<0.0.20.156836>}}]
151     trap_exit: true
152     status: running
153     heap_size: 2586
154     stack_size: 27
155     reductions: 2849
156   neighbours:
disbfnqx

disbfnqx1#

RabbitMQ可能不支持无符号整数作为表值。
请尝试使用带符号的32位或64位数字(例如.value = {.kind = AMQP_FIELD_KIND_I32, .value = {.i32 = 234 }})。
此外,RabbitMQ服务器日志可能包含额外的调试信息,可帮助理解此类错误,并且amqp_error_string2函数可用于将错误代码转换为错误字符串。

相关问题