使用rest api时选择Azure事件中心的分区

2023-12-11

我正在尝试使用 python 和其余 API 向 Azure 事件中心发送消息 经过一些失败的实验后,我找到了工作代码(见下文),但我希望能够选择将事件发送到哪个分区。

使用其余 API 是否可以实现这一点?如果可以,应该如何完成?

#!/user/bin/python
import json
from datetime import datetime
from multiprocessing import Pool
# from azure.servicebus import _service_bus_error_handler

from azure.servicebus.servicebusservice import ServiceBusService, ServiceBusSASAuthentication

from azure.http import (
    HTTPRequest,
    HTTPError
)

from azure.http.httpclient import _HTTPClient

EVENT_HUB_HOST = "mysecrethub.servicebus.windows.net"
EVENT_HUB_NAME = "secerthub-name"
KEYNAME = "senderkey"  # needs to be loaded from ENV
KEYVALUE = "keyvalue"  # needs to be loaded from ENV
EXTRA_HEADERS = []
NUM_OF_PARTITIONS = 16


class EventHubClient(object):

    def __init__(self, host, hubname, keyname, keyvalue):
        self._host = host
        self._hub = hubname
        self._keyname = keyname
        self._key = keyvalue

    def sendMessage(self, body, partition=None, additional_headers=None):
        eventHubHost = self._host

        httpclient = _HTTPClient(service_instance=self)

        sasKeyName = self._keyname
        sasKeyValue = self._key

        authentication = ServiceBusSASAuthentication(sasKeyName, sasKeyValue)

        request = HTTPRequest()
        request.method = "POST"
        request.host = eventHubHost
        request.protocol_override = "https"
        request.path = "/%s/messages?api-version=2014-01" % (self._hub)
        request.body = body
        request.headers.append(('Content-Type', 'application/atom+xml;type=entry;charset=utf-8'))
        if additional_headers is not None:
            for item in additional_headers:
                request.headers.append(item)
        if partition is not None:
            value = json.dumps({'PartitionKey': partition})
            request.headers.append(('BrokerProperties', value))
        authentication.sign_request(request, httpclient)

        request.headers.append(('Content-Length', str(len(request.body))))

        status = 0

        try:
            resp = httpclient.perform_request(request)
            status = resp.status
        except HTTPError as ex:
            status = ex.status
        # print request.headers
        return status


def prepare_message(appid, sessionid, partitionKey=None, SessionEllapsed=None, DeviceOs=None):
    message = {"Name": "MonitorEvent"}
    Attributes = {"AppId": appid, "SessionStarted": "".join(str(datetime.now())[:-3])}
    if SessionEllapsed is not None:
        Attributes['SessionEllapsed'] = SessionEllapsed
    if DeviceOs is not None:
        Attributes['DeviceOs'] = DeviceOs
    if partitionKey is not None:
        message["PartitionKey"] = str(partitionKey)
        message["PartitionId"] = str(partitionKey)
        Attributes['ItemId'] = partitionKey
    message['Attributes'] = Attributes
    return json.dumps(message)


def send_monitoring_event(partition):
    hubClient = EventHubClient(EVENT_HUB_HOST, EVENT_HUB_NAME, KEYNAME, KEYVALUE)
    appid = 1
    sendertime = datetime.now().strftime('%Y%M%d-%H%M%S')
    message = prepare_message(appid, sendertime, partitionKey=partition, SessionEllapsed=1, DeviceOs='Monitor' + str(partition))
    # print message
    hubStatus = hubClient.sendMessage(message, partition=None, additional_headers=EXTRA_HEADERS)
# return the HTTP status to the caller
    return hubStatus


def main():
    pool = Pool(processes=NUM_OF_PARTITIONS)

    print pool.map(send_monitoring_event, range(NUM_OF_PARTITIONS))

if __name__ == '__main__':
    main()

遵循事件中心 REST API 文档的“发送事件”部分https://msdn.microsoft.com/en-us/library/azure/dn790664.aspx,您不能使用请求 URI https://{serviceNamespace}.servicebus.windows.net/{eventHubPath}/messages 来选择将事件发送到哪个分区。

您应该使用请求 URI https://{serviceNamespace}.servicebus.windows.net/{eventHubPath}/publishers/{deviceId}/messages。属性 {deviceId} 是用于对设备进行分组/分区的分区键 - 无论是地理位置、设备类型、版本、租户等。

但分区数必须是2到32之间的数字。因此,如果您需要使用超过32个分区,我建议将密钥放入事件数据中。

此致。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用rest api时选择Azure事件中心的分区 的相关文章

随机推荐

  • 获取div标签特殊属性的值

    如果下一个命令 console log document getElementById container prints div div 为什么下一个命令 console log document getElementById contai
  • Matplotlib 绘制配对图?

    昨天我发布了这个 使用 DataFrame 矩阵的相关散点图 因为我的英语在技术方面不太好 所以我很难解释我的问题是什么 我试图绘制一个pairplot使用此相关数据 https i stack imgur com uJvG1 png oz
  • 更改android开发设备id

    我想将多个 Android 设备连接到同一台机器并通过 adb 管理它们 不幸的是 某些 Android 型号向 adb 显示相同的开发设备 ID 有没有办法改变开发设备ID adb devices List of devices atta
  • 如何在 Utf-8 -> php 脚本 -> mysql 中执行 HTTP POST

    我正在使用 Delphi 7 和 ICS 组件与 php 脚本通信并在 mysql 数据库中插入一些数据 如何使用 http post 发布 unicode 数据 使用 tnt 控件中的 utf8encode 后 我将其发布到 PHP 脚本
  • 如何用 EditText 中的图像替换字符串?

    我目前正在开发一个简单的聊天应用程序 我想在这个应用程序中添加表情符号功能 我已经有一个从其他用户接收字符串的函数 我想要的是 如果用户发送的文本包含像 D 或 p 这样的字符序列 我希望它们被更改为表情符号 我该如何实现这个功能呢 我想要
  • 为什么 `sched_setscheduler()` 需要 root 权限?

    为什么sched setscheduler 需要root权限吗 我正在编写一些受益于设置 SCHED FIFO 的代码 但如果我使用 sched setscheduler 我现在必须要求此进程以 root 身份运行 为什么不允许sched
  • Tkinter:获取屏幕文本单位宽度。 (不是像素)

    我正在使用 Tkinter 为应用程序设计 UI 我正在使用网格几何形状 在指定按钮宽度 或任何小部件宽度 时 我意识到宽度应该以文本单位而不是像素指定 因为我想让它独立于平台和屏幕尺寸 有没有办法获得最大文本单元宽度 这样我就可以在此基础
  • Win32 的 FindWindow() 可以找到具有确切标题的特定窗口,但是“try.bat - 记事本”呢?

    Win32 s FindWindow 可以找到一个标题为 Untitled Notepad 的窗口 但是如果我只想找到一个记事本窗口但不知道标题栏上的它是 try bat Notepad 还是其他文件名怎么办 看来如果title传入NULL
  • Java,获取两个日期之间的天数

    在java中 我想获取两个日期之间的天数 不包括这两个日期 例如 如果第一次约会 11 November 2011第二个日期 13 November 2011那么应该是1 这是我正在使用但不起作用的代码 secondDate and fir
  • 从 JavaScript 中的对象获取值[重复]

    这个问题在这里已经有答案了 我有这个对象 var data id 1 second abcd 这些是来自表单的值 我将其传递给函数进行验证 如果上述属性存在 我们可以通过以下方式获取它们的值data id and data second 但
  • Knit2html 未复制 R Studio 中 Knit HTML 按钮的功能

    我正在尝试在 Ubuntu 10 04 中编写一个 Bash 脚本 该脚本打开一个导出 CSV 的 Python 文件 然后运行以下 Rscript 目的是从 Dashboard Rmd 导出带有绘图的 HTML require knitr
  • 按下按钮时循环播放功能? Unity3d C#

    所以 我有一个对象 当我按下旋转按钮时 我希望它旋转 当我按下停止按钮时 我希望它停止 当它处于 void Update 中时它旋转得很好 但是当它处于它自己的函数中时 它只执行一次 我尝试使用循环但仍然没有运气 有人可以帮我吗 Code
  • 使用 ob_start 时如何重定向 php 中的标头位置?

    When condition是真的我明白了 Hello 我想要的是当 condition是真的 那就去谷歌吧 我不知道发生了什么 你能解释一下或者给我一个解决方案吗 Thanks 只需添加ob end clean 在标头调用之前
  • 如何在刷新后保持复选框处于选中状态?

    我需要向此代码添加什么 才能使复选框即使在刷新页面后也保持选中状态 代码示例或解释将不胜感激这是该项目的完整代码 https github com Orelso Project notes 如果您需要我添加代码的任何其他部分 请告诉我 im
  • Android 模拟器错误:- 执行 /system/bin/e2fsck 失败:没有这样的文件或目录

    我正在尝试运行我的第一个 Android 应用程序Android Emulator on API 19 The Emulator开始但没有任何反应 意味着主屏幕没有出现 这是我的第二周Android 这是 log cat 的前两行 02 2
  • Ctypes:无法导入windll

    我在 Windows 7 64 位上运行 Python 2 7 32 位 Anaconda 我想使用 ctypes 进行 win32 API 调用 但我有一个非常奇怪的问题 我可以import ctypes 但不是import ctypes
  • 如何将 P 元素内的文本放在图像旁边?

    这是我的代码 img src images example jpg width 70px p This is some example text that i want next to the image on the right hand
  • QtDesigner 和 PySide:QTableWidget 无法访问

    我在 QtDesigner 中制作了一个表单 该表单在该函数的帮助下从 PySide 加载 widget loader load file parent 但是 QTableWidget 带有 objectNname buffer table
  • 如何将响应数据设置到 TodayExtension 小部件中

    尝试从服务访问响应数据以显示到 TodayExtensions 小部件中 import Foundation struct MarketIndex Codable let indicesName String let indicesValu
  • 使用rest api时选择Azure事件中心的分区

    我正在尝试使用 python 和其余 API 向 Azure 事件中心发送消息 经过一些失败的实验后 我找到了工作代码 见下文 但我希望能够选择将事件发送到哪个分区 使用其余 API 是否可以实现这一点 如果可以 应该如何完成 user b