使用Azure EventHostProcessor Receiver时从事件中心收到的垃圾值

时间:2015-09-23 15:20:50

标签: python azure qpid azure-eventhub

我正在使用 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。当通过它接收数据时,我看到在数据之前附加了两个垃圾值:

enter image description here

使用 Qpid-Proton的recv.py 接收相同的字符时,我看不到这些字符。有人面临同样的问题吗?

P.S:我还使用 Azure Python SDK 将数据发送到Azure事件中心,并使用Qpid-Proton的EventProcessorHost和recv.py接收它,并且没有遇到此类问题。仅因为Azure SDK不包含任何接收事件的方法,我才切换到Qpid-Proton库。

2 个答案:

答案 0 :(得分:1)

我使用qpid-proton v0.29 for C ++编写Microsoft Event Hub生产者应用程序和Microsoft.Azure.EventHubs v4.2编写Microsoft Event Hub使用者遇到相同的问题。消息正文开头的第一个“垃圾”字节是AMQP“嵌入式构造函数”,它指定后面的字节格式。在屏幕快照中,主体格式看起来像是字符串,例如“你好,世界”。在这种情况下,“嵌入式构造函数”为0xA1,表示后面的字节为ASCII,并且它们的数目可变。第二个“垃圾”字节是ASCII字符串中的字节数。对于“ hello world”,该值为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值”类型,则Microsoft库不喜欢它。如果Microsoft库Azure.Messaging.EventHubs v5.0.1是“ AMQP值”,则它甚至都不会解析主体数据。它在邮件正文中始终显示0字节。通过确保qpid-proton创建的消息正文使用二进制“数据”类型,我能够解决此问题。我没有在Python中尝试过,但这是C ++代码的样子。

proton::message msg;
std::string bodyString = "Hello World!";
proton::binary bodyBinary(bodyString.begin(), bodyString.end());
msg.body(bodyBinary);

在Python中,我将尝试确保消息正文具有“字节”数据类型,并查看其是否有效。

答案 1 :(得分:-1)

我试图通过使用qpid-proton发送消息并使用EventProcessorHost来接收消息来重现您的issus,但我失败了。但是,我认为它似乎是由Python字符编码引起的,就像Python2 message.body = u"This is a text string"中使用Unicode格式的代码一样。有关在Python中使用qpid-proton的信息,请参阅https://msdn.microsoft.com/en-us/library/azure/jj841070.aspx

根据我的经验,我建议您使用Azure SDK for Python的Service Bus / EventHubs API或使用EventHub REST API发送消息。对于EventHub来说,这是一种简单而稳定的方式。关于发送REST API的EventHub消息,请参阅https://msdn.microsoft.com/en-us/library/dn790664.aspx

到目前为止,在C#中使用EventProcessorHost API是从EventHubs接收消息的最有效方式,不需要担心字符编码问题。

最诚挚的问候。