使用 Azure EventHostProcessor Receiver 时,从事件枢纽接收到的垃圾值。

问题描述 投票:0回答:2

我用的是 Qpid-Proton-0.10(Python)--基于AMQP 1.0的消息传递库,用于发送数据到 Azure 事件枢纽. 为了接收数据,我使用 事件处理器主机 根据以下指南。https:/azure.microsoft.comen-indocumentationarticlesevent-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不包含任何接收Events的方法,我不得不改用Qpid-Proton库。

python azure qpid azure-eventhub
2个回答
0
投票

我使用qpid-proton v0.29 for C++编写Microsoft Event Hub producer应用程序,使用Microsoft.Azure.EventHubs v4.2编写Microsoft Event Hub consumer,遇到了同样的问题。 消息体开头的第一个 "垃圾 "字节是AMQP的 "嵌入式构造函数",它指定了后面字节的格式。 在您的屏幕截图中,看起来正文格式是一个字符串,例如 "hello world"。 在这种情况下,"嵌入式构造函数 "是0xA1,这说明后面的字节是ASCII码,而且数量不定。 第二个 "垃圾 "字节是ASCII字符串的字节数。 对于 "hello world "来说,这应该是11。 我不知道为什么微软库不为你解析这个。关于AMQP数据类型和消息格式的更多信息,请看以下内容。

AMQP数据类型。http:/docs.oasis-open.orgamqpcorev1.0osamqp-core-types-v1.0-os.html#section-types

AMQP消息格式。http:/docs.oasis-open.orgamqpcorev1.0osamqp-core-messaging-v1.0-os.html#section-message-format。

AMQP规范规定,消息体可以是 "AMQP值"、"数据 "或 "AMQP序列 "类型。 我发现,如果消息体的类型是 "AMQP Value",微软库不喜欢。 新的微软库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中,我会尝试确保消息体使用 "bytes "数据类型,看看是否有效。


-1
投票

我试图通过使用qpid-proton发送消息和使用EventProcessorHost接收消息来重现你的issus,但我失败了。然而,我认为这似乎是由Python字符编码引起的,就像Python2中使用Unicode格式的代码。message.body = u"This is a text string". 请参考 https:/msdn.microsoft.comen-uslibraryazurejj841070.aspx。 用于在Python中使用qpid-proton。

根据我的经验,我建议你使用Azure SDK for Python的Service BusEventHubs API,或者使用EventHub REST API来发送消息。这是EventHub的一种简单而稳定的方式。关于EventHub消息发送的REST API,请参考以下内容 https:/msdn.microsoft.comen-uslibrarydn790664.aspx。.

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

衷心祝愿。

© www.soinside.com 2019 - 2024. All rights reserved.