使用python

时间:2018-09-06 06:54:52

标签: python azure azure-eventhub azure-eventhub-capture

我正在使用azure事件中心python SDK通过此链接来向事件中心发送消息和从消息中心接收消息。https://github.com/Azure/azure-event-hubs-python/tree/develop。我可以成功发送和接收消息。但是我该如何解析消息并从事件数据对象中检索数据。请在下面找到代码。

import os
import sys
#import logging
from azure.eventhub import EventHubClient, Receiver, Offset

ADDRESS = 'sb://####.servicebus.windows.net/#####'
USER = '##########'
KEY = '##################################'
CONSUMER_GROUP = "$default"
OFFSET = Offset("-1")
PARTITION = "1"


total = 0
last_sn = -1
last_offset = "-1"

try:
  if not ADDRESS:
      raise ValueError("No EventHubs URL supplied.")
  client = EventHubClient(ADDRESS, debug=False, username=USER, password=KEY)
  receiver = client.add_receiver(CONSUMER_GROUP, PARTITION, prefetch=5000, 
  offset=OFFSET)
  client.run()
  try:
      batched_events = receiver.receive(timeout=20)
  except:
      raise
  finally:
      client.stop()
  for event_data in batched_events:
      last_offset = event_data.offset.value
      last_sn = event_data.sequence_number
      total += 1
      print("Partition {}, Received {}, sn={} offset={}".format(
         PARTITION,
         total,
         last_sn,
         last_offset))

except KeyboardInterrupt:
   pass

如果我尝试查看收到的event_data,我可以看到以下消息。 event_data <azure.eventhub.common.EventData at 0xd4f1358> event_data.message

<uamqp.message.Message at 0xd4f1240>

上述有关如何解析此消息以提取数据的任何帮助

3 个答案:

答案 0 :(得分:1)

1.1.0开始,有新的实用程序方法可提取消息的实际数据:

所以,过去是

import json
event_obj = json.loads(next(event_data.body).decode('UTF-8'))

现在是:

event_obj = event_data.body_as_json()

答案 1 :(得分:0)

根据位于
的源代码 https://github.com/Azure/azure-event-hubs-python/blob/master/azure/eventhub/common.py#L185 event_data.body应该返回您的消息正文。
body返回一个生成器。要一次访问一条消息,请使用next方法。

messages = event_data.body
next(messages) -> get 1st message
next(messages) -> get 2nd message
...
next(messages) -> get the last message
next(messages) -> StopIteration

StopIteration异常是指迭代结束,没有更多消息可检索。

如果要一次检索所有消息,可以使用-list(event_data.body)

使用这些很棒的Python内置功能,您可以自己找到答案:

  • 使用Python内置的dir函数来查找对象支持的所有方法和值。如果您要进行dir(event_data),则会看到方法-列出了body
  • 要查看有关任何方法/函数/类的文档(具体为文档字符串),可以执行print object.__doc__。就您而言,执行print event_data.body.__doc__将打印body的内容。

答案 2 :(得分:0)

对于使用Event Hub版本5.2.0的用户-截止到今天(GitHubReference Docs),该版本与1.1.0版本相同,即使用body_as_str()body_as_json()。但是客户端已更改-新版本中有一个EventHubProducerClient和一个EventHubConsumerClient。要打印收到的事件的正文,请执行以下操作:

from azure.eventhub import EventHubConsumerClient

connection_str = '<< CONNECTION STRING FOR THE EVENT HUBS NAMESPACE >>'
consumer_group = '<< CONSUMER GROUP >>'
eventhub_name = '<< NAME OF THE EVENT HUB >>'

client = EventHubConsumerClient.from_connection_string(
        connection_str, consumer_group, eventhub_name=eventhub_name
    )

def on_event_batch(partition_context, events):
    partition_context.update_checkpoint()
    for e in events:
        print(e.body_as_str())

with client:
    client.receive_batch(
        on_event_batch=on_event_batch,
        starting_position="-1",  # "-1" is from the beginning of the partition.
    )