Функция Azure с привязкой концентратора событий не работает - PullRequest
0 голосов
/ 06 июня 2018

Я использую функцию Azure для отправки сообщения на несколько выходов концентратора событий (с входа EH).Мой код следующий:

[FunctionName("Gateway")]
    public static void Run([EventHubTrigger("%INPUT_HUB_NAME%", Connection = "iothubconnection", ConsumerGroup = "functiontest")]EventData[] eventHubMessage,
        [EventHub("%OUT_HUB_NAME%", Connection = "eventhuboutput")]out EventData outputEventHubMessageHotPath,
        [EventHub("%OUT_HUB_NAME%", Connection = "eventhuboutput2")]out EventData outputEventHubMessageColdPath,
        TraceWriter log)
    {
        log.Info("**-- Start Azure Func -- **");


        foreach (var ehMsg in eventHubMessage)
        {
            //section to build up the raw section
            var rawMessageSection = GetPayload(ehMsg.GetBytes());
            var deviceId = GetDeviceId(ehMsg);
            log.Info($"Extracted deviceId: {deviceId}");
            if (rawMessageSection.aggregates != null)
            {
                var message = CreateEHMessages("aggregates", rawMessageSection, deviceId, log);

                outputEventHubMessageHotPath = message;
                outputEventHubMessageColdPath = message;
            }
            if (rawMessageSection.events != null)
            {
                outputEventHubMessageColdPath = CreateEHMessages("events", rawMessageSection, deviceId,  log);
            }
            if (rawMessageSection.ipis != null)
            {
                outputEventHubMessageColdPath = CreateEHMessages("ipis", rawMessageSection, deviceId, log);
            }
            if (rawMessageSection.errors != null)
            {
                outputEventHubMessageColdPath = CreateEHMessages("errors", rawMessageSection, deviceId,  log);
            }
            if (rawMessageSection.batteries != null)
            {
                outputEventHubMessageColdPath = CreateEHMessages("batteries", rawMessageSection, deviceId,  log);
            }
            //await Task.WhenAll(tasks);
        }
        outputEventHubMessageHotPath = outputEventHubMessageColdPath = null;
    }

где:

 public static EventData CreateEHMessages(string messageType, dynamic messageBatch, string deviceId, TraceWriter log)
    {
       var timezone = messageBatch.timezone;
        var deviceInstanceId = messageBatch.deviceInstanceId;
        int i = 0;
        List<dynamic> result = new List<dynamic>();
        foreach (var msg in messageBatch[messageType])
        {

            msg.deviceId = deviceId;
            msg.timezone = timezone;
            msg.deviceInstanceId = deviceInstanceId;
            msg.type = messageType;

            result.Add(msg);
            i++;
        }
        var eventData = new EventData(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(result)));
        eventData.PartitionKey = deviceInstanceId;
        return eventData;


    }

Проблема заключается в том, что эта функция НЕ публикуется в EventHub.Я пытался использовать другой синтаксис привязки, но я не могу заставить его работать.Я подозреваю, что это связано с выходными привязками, но я снова попробовал много вариантов.Есть идеи?

1 Ответ

0 голосов
/ 06 июня 2018

Вы устанавливаете параметр out несколько раз, поэтому все, кроме последних назначений, будут потеряны.Но ваше последнее назначение - установить их на null, что по сути означает, что вы не возвращаете никаких сообщений от своей функции.

Взгляните на ICollector.

Определите ваши выходные параметры как коллекторы:

[EventHub("%OUT_HUB_NAME%", Connection = "eventhuboutput")] 
ICollector<EventData> outputEventHubMessageHotPath,

Затем добавьте каждое сообщение в коллекторы, например:

if (rawMessageSection.events != null)
{
    outputEventHubMessageHotPath.Add(
        CreateEHMessages("events", rawMessageSection, deviceId,  log));
}
...