我正在使用基于Qpid-Proton-0.10(Python)- AMQP 1.0的消息传递库将数据发送到Azure事件中心。要接收数据,我将按照以下指南使用EventProcessorHost:https://azure.microsoft.com/en-in/documentation/articles/event-hubs-csharp-ephcs-getstarted/#receive-messages-with-eventprocessorhost。当通过它接收数据时,我看到两个垃圾值附加在数据之前:
我没有看到这样的字符,而收到相同的使用Qpid质子的recv.py。
P.S:我也使用Azure Python SDK向Azure Event hub发送数据,并使用Qpid-Proton的EventProcessorHost和www.example.com接收数据recv.py,没有遇到这样的问题。只是因为Azure SDK不包含任何接收事件的方法,所以我不得不切换到Qpid-Proton库。
3条答案
按热度按时间rdrgkggo1#
我在使用qpid-proton v0.29 for C编写Microsoft Event Hub生产者应用程序和使用Microsoft.Azure.EventHubs v4.2编写Microsoft Event Hub消费者时遇到了同样的问题。消息正文开头的第一个“垃圾”字节是AMQP“嵌入式构造函数”,它指定了后面字节的格式。在屏幕截图中,正文格式看起来像是一个字符串,例如“helloworld”。在此情况下,“嵌入式构造函数”是0xA 1,其指示随后的字节是ASCII且存在可变数目的字节。第二个“垃圾”字节是ASCII字符串中的字节数目。对于“helloworld”,这将是11。我不知道为什么Microsoft库不为您解析它。有关AMQP数据类型和消息格式的更多信息,请参阅以下内容:
AMQP数据类型:http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-types-v1.0-os.html#section-types
AMQP消息格式:http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-messaging-v1.0-os.html#section-message-format
AMQP规范规定消息主体可以是“AMQP值”,“数据”,或者“AMQP序列”。我发现微软库不喜欢消息体的类型是“AMQP值”。较新的微软库Azure.Messaging.EventHubs v5.0.1甚至不会解析消息体数据,如果它是一个“AMQP值”。它总是在消息体中显示0字节。我可以通过确保qpid-proton创建的消息体使用二进制“Data”类型来解决这个问题。我还没有在Python中尝试过,但C代码如下所示。
在Python中,我会尝试确保消息正文具有“bytes”数据类型,然后看看是否有效。
qf9go6mv2#
我想对艾米丽的回答发表意见,但我不能。
我也遇到过类似的问题,她的回答帮了我很大的忙。唯一缺少的是你还需要将推断的标志设置为True。
我也在C++工作:
来自文档:
消息的推断标志指示如何将消息内容编码到AMQP节中。如果推断为True,则消息正文中的二进制值和列表值将分别编码为AMQP DATA和AMQP SEQUENCE节。如果推断为False,则消息正文中的所有值都将编码为AMQP VALUE节,而不管其类型如何。
C++和Python的文档分别在这里和这里。
py49o6xq3#
我试着用qpid-proton发送消息,用EventProcessorHost接收消息来重新生产你的问题,但是我失败了。但是,我认为这似乎是由Python字符编码引起的,像Python 2
message.body = u"This is a text string"
中使用Unicode格式的代码。请参考https://msdn.microsoft.com/en-us/library/azure/jj841070.aspx在Python中使用qpid-proton。根据我的经验,我建议您使用Azure SDK for Python的服务总线/EventHubs API或使用EventHub REST API来发送消息。这是一种简单而稳定的EventHubs方法。关于EventHub消息发送REST API,请参阅https://msdn.microsoft.com/en-us/library/dn790664.aspx。
到目前为止,在C#中使用EventProcessorHost API是从EventHub接收消息的最有效方法,无需担心字符编码的问题。
此致。