2015-08-27 2 views
4

Я пытаюсь отправить сообщения в Azure Event Hub с помощью python, а остальное API после некоторых неудачных экспериментов я нашел рабочий код (см. Ниже), но я хочу быть в состоянии для выбора того, какой раздел отправить событие.Выбор раздела концентратора событий Azure при использовании rest api

Возможно ли это с использованием остального 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() 

ответ

1

После раздела 'Отправить событие' Соревнований концентраторы REST API, docunment https://msdn.microsoft.com/en-us/library/azure/dn790664.aspx, вы не можете использовать Request URI https: // {serviceNamespace} .servicebus.windows.net/{eventHubPath}/сообщений в выберите, какой раздел для отправки событий.

Вы должны использовать URI запроса https: // {serviceNamespace} .servicebus.windows.net/{eventHubPath}/publishers/{deviceId}/messages. Атрибут {deviceId} - это ключ раздела, который используется для группировки/разделения устройств - будь то геоопределение, тип устройства, версия, арендатор и т. Д.

Но количество разделов должно быть числом от 2 до 32. Поэтому, если вам нужно использовать более 32 разделов, я предлагаю поместить ключ в данные события.

С наилучшими пожеланиями.

+0

спасибо, я попробую это. – Srgrn

+0

Однако, когда я это делаю, все они попадают в один и тот же раздел, даже если я использую разные deviceID (целые числа)? – Srgrn

+0

@Srgrn Я думаю, что ваши запросы URI не соответствуют их собственным ожиданиям. См. Раздел «Политика издателя» документа https://azure.microsoft.com/en-us/documentation/articles/event-hubs-overview/#event-publisher. Любые проблемы, пожалуйста, прокомментируйте меня. –

Смежные вопросы