2

我尝试实现另一个 amqp-client(在 C++ 上,与我们的基础框架高度集成)。而且我已经到了解释内容标头有效负载的地步,但我找不到关于属性标志和属性列表之间关系的清晰描述。如果我在属性标志中得到 F1%b1,F2%b1, ... ,Fn%b0,我必须在属性列表中期望什么 *amqp-field 序列?

请任何人指出我可以在哪里找到此信息的任何文档?

4

1 回答 1

2

我意识到这是一篇旧文章,但由于我最近对这个主题有所启发,我将在这里发表我的观察,以防其他人需要了解这个细节。

我最近刚刚在尝试为 Perl 实现 AMQP API 以与 RabbitMQ 服务器通信时进行了这场战斗。我也没有找到任何关于这个细节的官方文档。但是,rabbitmq 文档中包含 JAVA API 的源代码。

http://www.rabbitmq.com/java-client.html

埋在所有源代码中的是一个 python 实用程序,它生成低级框架构造代码。

所以,一些背景 - 属性是可能附加到队列中的消息的属性。这些不是任意属性,而是具有特定定义。特别是,这些属性被定义为 BASIC 类的成员(即类#60)。BASIC 类是唯一具有属性的类。这些属性出现在内容标题帧的尾部。他们的规范分为两部分:

  • 属性标志
  • 财产清单

属性标志用于指定 14 个属性中的哪一个记录在属性列表中。这些在属性标志中被编码为单独的位。BASIC 类定义按顺序列出了属性(请参阅:http ://www.rabbitmq.com/resources/specs/amqp0-9-1.xml ),并且在属性标志中引用它们的顺序也是如此。因此,属性标志八位字节:

00010000 01000000 (0x 10 40)

14 个属性中的参考 2:“delivery-mode”和“timestamp”。如果标志中的所有位都是“0”,则表示没有引用任何属性。

那么对于属性列表,delivery-mode 属性首先被编码,然后是时间戳。交付模式指定为单个八位字节,时间戳指定为“long-long-uint”,或 8 个八位字节的网络编码(即大端)整数。根据该代码,属性列表字节是根据设置的属性标志构建的。因此,如果没有设置属性标志 - 即。全部为“0”,没有属性列表字节是标题帧的一部分。那么,组装这些:

10 40 01 00 00 00 00 53 3B 2B 47
^ flags     
      ^ delivery-mode (1 = non-persistent)
         ^ timestamp (1396386631 (unix epoch) = Tue Apr  1 15:10:31 2014)
于 2014-04-01T21:23:09.933 回答