4

Python と残りの API を使用して Azure Event Hub にメッセージを送信しようとしていますが、失敗したいくつかの実験の後、動作するコードが見つかりました (以下を参照) が、イベントを送信するパーティションを選択できるようにしたいと考えています。

残りの 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()
4

1 に答える 1

1

Event Hubs 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 を超えるパーティションを使用する必要がある場合は、キーをイベント データに入れることをお勧めします。

よろしくお願いします。

于 2015-08-28T09:12:41.700 に答える