目标:使用 python 从 EventHub 接收消息。
设置:
- Python 3.5
- AMQP 1.0
- 在新门户中创建的 EventHub。
- Ubuntu 16.04 和 Mac OS X。
- 质子==0.8.8和python-qpid-proton==0.17.0
这几天我一直在尝试通过 AMQP 连接到 Azure EventHub。我可以使用 Java 客户端来完成此操作(作为确保 EventHub 正常工作的测试),但我需要能够使用 Python 来完成此操作。
在网上阅读了几个示例后,我在过去的几天里尝试了很多东西。
我正在使用 RootManageSharedAccessKey
生成的 key 没有任何 /
为我。我已经尝试过urllib.quote
和正常一样。
目前我的字符串如下所示:
amqps://RootManageSharedAccessKey:<primary key>@<namespace>.servicebus.windows.net/<internal hub name>
如果我将这些相同的参数复制到 Java 客户端中,它就可以正常工作。如果我使用 python SDK 发送它也可以正常工作(它通过 HTTPS 发送)。我尝试过使用 amqps
和amqp
如果我打开 AMQP 的调试参数,我会收到错误:
condition=:"amqp:unauthorized-access",
description="Unauthorized access. 'Send' claim(s) are required to perform this operation.
Resource: 'sb://<namespace>.servicebus.windows.net/<internal event hub>
这听起来是一个权限问题,但相同的 key 和一切在 Java 和 Python 中通过 HTTPS 运行得很好,所以它必须是我的代码与 key 中的某些东西。也许我没有正确编码它们(我读过你不需要对它们进行编码)?一旦我让它工作起来,我就会为其他人制作一个 GIST 和更新。
我当前的发送代码如下,应该更容易:
from proton import Messenger, Message
messenger = Messenger()
message = Message()
key = "key"
message.address = "amqps://RootManageSharedAccessKey:"+key+"@<namespace>.servicebus.windows.net/<hubname>"
message.body = u"This is a text string"
messenger.put(message)
messenger.send()`
我尝试过的事情:
- 在事件中心和命名空间上分别制定发送和接收策略。
- 重新创建中心
- 安全与不安全
- 将端口添加到防火墙
- Python 2.7 proton 与 3.5
- Linux 与 Mac
- 主键与辅助键
- 新命名空间
- 有或没有的新 key
/
在 key 中 - URL 编码部分和整个字符串
- UTF-8 编码
- JSON 消息与文本消息。
最佳答案
这对于您的项目来说可能为时已晚,但是这里有一个用于 Python 的新 AMQP 1.0 库正在开发中:
http://github.com/Azure/azure-uamqp-python
尽管它仍处于早期阶段(尚未准备好生产),但存储库中提供了一些可与 Azure 事件中心一起使用的示例:
https://github.com/Azure/azure-uamqp-python/tree/master/samples
关于您在使用 Proton 时看到的错误 - 这看起来可能是尝试使用错误的身份验证机制。您是否尝试过使用 Event Hubs Python SDK ?他们正在使用 some settings here这可能会让人感兴趣
关于python-3.x - 使用 AMQP 从 Azure Eventhub 接收事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43104229/