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()