我尝试实现另一个amqp-client(在C ++上,与我们的基础框架高度集成)。而且我已经到了解释内容头有效负载的地步,我找不到属性标志和属性列表之间关系的清晰描述。如果我在属性标志中得到F1%b1,F2%b1,...,Fn%b0,我必须在属性列表中看到什么* amqp-field序列?
请有人,请指出我可以找到这些信息的任何文件吗?
答案 0 :(得分:1)
我意识到这是一篇很老的帖子,但是由于我最近对这个主题有了一些启发,我会在这里发表我的观察,以防其他人需要了解这个细节。
我最近在尝试为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个:"交付模式"和"时间戳"。如果标志中的所有位都是" 0",则表示没有引用NO属性。
然后对于属性列表,首先编码传递模式属性,然后是时间戳。传递模式被指定为单个八位字节,时间戳被指定为" 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)