diff --git a/src/DurableTask.ServiceBus/Common/Abstraction/ServiceBusAbstraction.cs b/src/DurableTask.ServiceBus/Common/Abstraction/ServiceBusAbstraction.cs index 26cecadc..ecd049b8 100644 --- a/src/DurableTask.ServiceBus/Common/Abstraction/ServiceBusAbstraction.cs +++ b/src/DurableTask.ServiceBus/Common/Abstraction/ServiceBusAbstraction.cs @@ -3,8 +3,10 @@ namespace DurableTask.ServiceBus.Common.Abstraction { using System; using System.Collections.Generic; + using System.Diagnostics; using System.Linq; using System.Threading.Tasks; + using DurableTask.Core.Tracing; /// public class IMessageSession @@ -330,15 +332,35 @@ public async Task SendAsync(Message message) await sender.SendMessageAsync(message); } + /// + /// Sends the messages in a single batch. Messages that do not fit in the batch are not sent and are traced as errors. + /// public async Task SendAsync(IEnumerable messageList) { - var batch = await sender.CreateMessageBatchAsync(); - foreach (var message in messageList) + using (Azure.Messaging.ServiceBus.ServiceBusMessageBatch batch = await sender.CreateMessageBatchAsync()) { - batch.TryAddMessage(message); + int droppedCount = 0; + long droppedBodyBytes = 0; + foreach (Azure.Messaging.ServiceBus.ServiceBusMessage sbMessage in messageList) + { + if (!batch.TryAddMessage(sbMessage)) + { + droppedCount++; + droppedBodyBytes += sbMessage.Body.ToMemory().Length; + } + } + + if (droppedCount > 0) + { + TraceHelper.Trace( + TraceEventType.Error, + "MessageSender-SendAsync-MessagesDropped", + () => $"{droppedCount} message(s) ({droppedBodyBytes} body bytes) did not fit in the batch for '{sender.EntityPath}' " + + $"and were not sent; {batch.Count} message(s) were added to the batch (maximum batch size: {batch.MaxSizeInBytes} bytes)."); + } + + await sender.SendMessagesAsync(batch); } - - await sender.SendMessagesAsync(batch); } public async Task CloseAsync()