Azure Function with Event Hub out binding does not work

末鹿安然 提交于 2019-12-11 15:19:12

问题


I am using Azure Function to send out message to multiple Event Hub outputs (from an input EH). My code is the following:

[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;
    }

where:

 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;


    }

The problem is that this Function does NOT seem to publish to EventHub. I have tried to use different syntax of binding but i cannot get it to work. I suspect is something to do with output bindings but I again tried many options. Any idea?


回答1:


You set out parameter multiple times, so all but the last assignments will be lost. But your last assignment is setting them to null, which essentially means you return no messages from your Function.

Have a look at ICollector instead.

Define your output parameters as Collectors:

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

Then add every message to the Collectors, e.g.:

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


来源:https://stackoverflow.com/questions/50719837/azure-function-with-event-hub-out-binding-does-not-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!