toto'
toto'

Reputation: 1574

Azure Function with Event Hub out binding does not work

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?

Upvotes: 0

Views: 736

Answers (1)

Mikhail Shilkov
Mikhail Shilkov

Reputation: 35124

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

Upvotes: 4

Related Questions