< Summary

Class:Azure.Messaging.EventHubs.Samples.Sample04_PublishMultipleEventBatches
Assembly:Azure.Messaging.EventHubs.Samples
File(s):C:\Git\azure-sdk-for-net\sdk\eventhub\Azure.Messaging.EventHubs\samples\Sample04_PublishMultipleEventBatches.cs
Covered lines:0
Uncovered lines:32
Coverable lines:32
Total lines:135
Line coverage:0% (0 of 32)
Covered branches:0
Total branches:24
Branch coverage:0% (0 of 24)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
get_Name()-0%100%
get_Description()-0%100%
RunAsync()-0%0%
TryDequeue(...)-0%0%

File(s)

C:\Git\azure-sdk-for-net\sdk\eventhub\Azure.Messaging.EventHubs\samples\Sample04_PublishMultipleEventBatches.cs

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License.
 3
 4using System;
 5using System.Collections.Generic;
 6using System.Threading.Tasks;
 7using Azure.Messaging.EventHubs.Producer;
 8using Azure.Messaging.EventHubs.Samples.Infrastructure;
 9
 10namespace Azure.Messaging.EventHubs.Samples
 11{
 12    /// <summary>
 13    ///   An example of publishing events using multiple batches.
 14    /// </summary>
 15    ///
 16    public class Sample04_PublishMultipleEventBatches : IEventHubsSample
 17    {
 18        /// <summary>
 19        ///   The name of the sample.
 20        /// </summary>
 21        ///
 022        public string Name => nameof(Sample04_PublishMultipleEventBatches);
 23
 24        /// <summary>
 25        ///   A short description of the sample.
 26        /// </summary>
 27        ///
 028        public string Description => "An example of publishing events using multiple batches.";
 29
 30        /// <summary>
 31        ///   Runs the sample using the specified Event Hubs connection information.
 32        /// </summary>
 33        ///
 34        /// <param name="connectionString">The connection string for the Event Hubs namespace that the sample should tar
 35        /// <param name="eventHubName">The name of the Event Hub, sometimes known as its path, that the sample should ru
 36        ///
 37        public async Task RunAsync(string connectionString,
 38                                   string eventHubName)
 39        {
 40             // It is important to be aware that the EventDataBatch is responsible for unmanaged resources and should be
 41             // after it has been published.  A batch cannot be reused nor published multiple times.  In the case where 
 42             // that you would like to publish do not fit into a single batch, a new batch should be created.
 43             //
 44             // In this example, we'll create a set of events that will need to span multiple batches to publish.  As wi
 45             // examples, we'll begin by creating an Event Hub producer client to create the batches and publish events 
 46
 047            await using (var producerClient = new EventHubProducerClient(connectionString, eventHubName))
 48            {
 49                // Because the maximum size of an event batch is dictated by the Event Hubs service and varies between t
 50                // service plan levels, we'll create a batch to query for its maximum allowed size before we create our 
 51
 52                long maximumBatchSize;
 53
 054                using (EventDataBatch measureBatch = await producerClient.CreateBatchAsync())
 55                {
 056                    maximumBatchSize = measureBatch.MaximumSizeInBytes;
 057                }
 58
 59                // Create our set of events such that we'll need three batches to publish them all.
 60
 061                int eventsPerBatch = 4;
 062                int batchCount = 3;
 063                int eventCount = (batchCount * eventsPerBatch);
 064                long eventSize = (maximumBatchSize / eventsPerBatch);
 65
 066                Queue<EventData> eventsToPublish = new Queue<EventData>(eventCount);
 67
 068                for (int index = 0; index < eventCount; ++index)
 69                {
 70                    // Because the content of the event is not interesting to us, we'll
 71                    // use an empty array of the correct size.
 72
 073                    eventsToPublish.Enqueue(new EventData(new byte[eventSize]));
 74                }
 75
 76                // Now that our events are available, create the batches and send them.
 77
 078                int currentBatch = 0;
 79
 080                while (eventsToPublish.Count > 0)
 81                {
 082                    using (EventDataBatch eventBatch = await producerClient.CreateBatchAsync())
 83                    {
 084                        while ((TryDequeue(eventsToPublish, out EventData currentEvent)) && (eventBatch.TryAdd(currentEv
 85                        {
 86                        }
 87
 88                        // When an event could not be dequeued or could not be added to the batch, then the batch is rea
 89
 090                        if (eventBatch.Count > 0)
 91                        {
 092                            await producerClient.SendAsync(eventBatch);
 93
 094                            ++currentBatch;
 095                            Console.WriteLine($"Batch: { currentBatch } containing { eventBatch.Count } events was publi
 96                        }
 097                    }
 98
 99                    // At this point, the batch has passed it's "using" scope and has been safely disposed of.  If there
 100                    // queue, a new batch will be created for them.
 101                }
 102
 0103                Console.WriteLine();
 0104                Console.WriteLine("All events have been published.");
 0105            }
 106
 107            // At this point, our client has passed its "using" scope and has safely been disposed of.  We
 108            // have no further obligations.
 109
 0110            Console.WriteLine();
 0111        }
 112
 113        /// <summary>
 114        ///   Attempts to dequeue an event from the specified <paramref name="queue"/>.
 115        /// </summary>
 116        ///
 117        /// <param name="queue">The queue to attempt to dequeue from.</param>
 118        /// <param name="currentEvent">The current event that was dequeued, or <c>null</c> if no event was available.</p
 119        ///
 120        /// <returns><c>true</c> if an event was dequeued; otherwise, <c>false</c>.</returns>
 121        ///
 122        private static bool TryDequeue(Queue<EventData> queue,
 123                                       out EventData currentEvent)
 124        {
 0125            if (queue.Count > 0)
 126            {
 0127                currentEvent = queue.Dequeue();
 0128                return true;
 129            }
 130
 0131            currentEvent = null;
 0132            return false;
 133        }
 134    }
 135}