< Summary

Class:Azure.Messaging.ServiceBus.ServiceBusMessageBatch
Assembly:Azure.Messaging.ServiceBus
File(s):C:\Git\azure-sdk-for-net\sdk\servicebus\Azure.Messaging.ServiceBus\src\Sender\ServiceBusMessageBatch.cs
Covered lines:35
Uncovered lines:0
Coverable lines:35
Total lines:169
Line coverage:100% (35 of 35)
Covered branches:2
Total branches:2
Branch coverage:100% (2 of 2)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
.ctor(...)-100%100%
get_MaxSizeInBytes()-100%100%
get_SizeInBytes()-100%100%
get_Count()-100%100%
get_InnerBatch()-100%100%
TryAddMessage(...)-100%100%
Dispose()-100%100%
Clear()-100%100%
AsEnumerable()-100%100%
Lock()-100%100%
Unlock()-100%100%
AssertNotLocked()-100%100%

File(s)

C:\Git\azure-sdk-for-net\sdk\servicebus\Azure.Messaging.ServiceBus\src\Sender\ServiceBusMessageBatch.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 Azure.Core;
 7using Azure.Messaging.ServiceBus.Core;
 8
 9namespace Azure.Messaging.ServiceBus
 10{
 11    /// <summary>
 12    ///   A set of <see cref="ServiceBusMessage" /> with size constraints known up-front,
 13    ///   intended to be sent to the Queue/Topic as a single batch.
 14    ///   A <see cref="ServiceBusMessageBatch"/> can be created using
 15    ///   <see cref="ServiceBusSender.CreateMessageBatchAsync(System.Threading.CancellationToken)"/>.
 16    ///   Messages can be added to the batch using the <see cref="TryAddMessage"/> method on the batch.
 17    /// </summary>
 18    ///
 19    public sealed class ServiceBusMessageBatch : IDisposable
 20    {
 21        /// <summary>An object instance to use as the synchronization root for ensuring the thread-safety of operations.
 2222        private readonly object _syncGuard = new object();
 23
 24        /// <summary>A flag indicating that the batch is locked, such as when in use during a send batch operation.</sum
 25        private bool _locked = false;
 26
 27        /// <summary>
 28        ///   The maximum size allowed for the batch, in bytes.  This includes the messages in the batch as
 29        ///   well as any overhead for the batch itself when sent to the Queue/Topic.
 30        /// </summary>
 31        ///
 232        public long MaxSizeInBytes => InnerBatch.MaxSizeInBytes;
 33
 34        /// <summary>
 35        ///   The size of the batch, in bytes, as it will be sent to the Queue/Topic.
 36        /// </summary>
 37        ///
 238        public long SizeInBytes => InnerBatch.SizeInBytes;
 39
 40        /// <summary>
 41        ///   The count of messages contained in the batch.
 42        /// </summary>
 43        ///
 644        public int Count => InnerBatch.Count;
 45
 46        /// <summary>
 47        ///   The transport-specific batch responsible for performing the batch operations
 48        ///   in a manner compatible with the associated <see cref="TransportSender" />.
 49        /// </summary>
 50        ///
 3851        private TransportMessageBatch InnerBatch { get; }
 52
 53        /// <summary>
 54        ///   Initializes a new instance of the <see cref="ServiceBusMessageBatch"/> class.
 55        /// </summary>
 56        ///
 57        /// <param name="transportBatch">The  transport-specific batch responsible for performing the batch operations.<
 58        ///
 59        /// <remarks>
 60        ///   As an internal type, this class performs only basic sanity checks against its arguments.  It
 61        ///   is assumed that callers are trusted and have performed deep validation.
 62        ///
 63        ///   Any parameters passed are assumed to be owned by this instance and safe to mutate or dispose;
 64        ///   creation of clones or otherwise protecting the parameters is assumed to be the purview of the
 65        ///   caller.
 66        /// </remarks>
 67        ///
 2268        internal ServiceBusMessageBatch(TransportMessageBatch transportBatch)
 69        {
 2270            Argument.AssertNotNull(transportBatch, nameof(transportBatch));
 2071            InnerBatch = transportBatch;
 2072        }
 73
 74        /// <summary>
 75        ///   Attempts to add a message to the batch, ensuring that the size
 76        ///   of the batch does not exceed its maximum.
 77        /// </summary>
 78        ///
 79        /// <param name="message">Message to attempt to add to the batch.</param>
 80        ///
 81        /// <returns><c>true</c> if the message was added; otherwise, <c>false</c>.</returns>
 82        ///
 83        public bool TryAddMessage(ServiceBusMessage message)
 84        {
 1885            lock (_syncGuard)
 86            {
 1887                AssertNotLocked();
 1488                return InnerBatch.TryAddMessage(message);
 89            }
 1490        }
 91
 92        /// <summary>
 93        ///   Performs the task needed to clean up resources used by the <see cref="ServiceBusMessageBatch" />.
 94        /// </summary>
 95        ///
 96        public void Dispose()
 97        {
 698            lock (_syncGuard)
 99            {
 6100                AssertNotLocked();
 4101                InnerBatch.Dispose();
 4102            }
 4103        }
 104
 105        /// <summary>
 106        ///   Clears the batch, removing all messages and resetting the
 107        ///   available size.
 108        /// </summary>
 109        ///
 110        internal void Clear()
 111        {
 4112            lock (_syncGuard)
 113            {
 4114                AssertNotLocked();
 2115                InnerBatch.Clear();
 2116            }
 2117        }
 118
 119        /// <summary>
 120        ///   Represents the batch as an enumerable set of specific representations of a message.
 121        /// </summary>
 122        ///
 123        /// <typeparam name="T">The specific message representation being requested.</typeparam>
 124        ///
 125        /// <returns>The set of messages as an enumerable of the requested type.</returns>
 126        ///
 6127        internal IEnumerable<T> AsEnumerable<T>() => InnerBatch.AsEnumerable<T>();
 128
 129        /// <summary>
 130        ///   Locks the batch to prevent new messages from being added while a service
 131        ///   operation is active.
 132        /// </summary>
 133        ///
 134        internal void Lock()
 135        {
 10136            lock (_syncGuard)
 137            {
 10138                _locked = true;
 10139            }
 10140        }
 141
 142        /// <summary>
 143        ///   Unlocks the batch, allowing new messages to be added.
 144        /// </summary>
 145        ///
 146        internal void Unlock()
 147        {
 10148            lock (_syncGuard)
 149            {
 10150                _locked = false;
 10151            }
 10152        }
 153
 154        /// <summary>
 155        ///   Validates that the batch is not in a locked state, triggering an
 156        ///   invalid operation if it is.
 157        /// </summary>
 158        ///
 159        /// <exception cref="InvalidOperationException">Occurs when the batch is locked.</exception>
 160        ///
 161        private void AssertNotLocked()
 162        {
 28163            if (_locked)
 164            {
 8165                throw new InvalidOperationException(Resources.MessageBatchIsLocked);
 166            }
 20167        }
 168    }
 169}