diff --git a/projects/RabbitMQ.Client/client/api/IModel.cs b/projects/RabbitMQ.Client/client/api/IModel.cs
index 15302f798c..d4cf36f229 100644
--- a/projects/RabbitMQ.Client/client/api/IModel.cs
+++ b/projects/RabbitMQ.Client/client/api/IModel.cs
@@ -291,6 +291,12 @@ void BasicPublish(string exchange, string routingKey, bool mandatory,
[AmqpMethodDoNotImplement(null)]
IBasicPublishBatch CreateBasicPublishBatch();
+ ///
+ /// Creates a BasicPublishBatch instance
+ ///
+ [AmqpMethodDoNotImplement(null)]
+ IBasicPublishBatch CreateBasicPublishBatch(int sizeHint);
+
///
/// Construct a completely empty content header for use with the Basic content class.
///
diff --git a/projects/RabbitMQ.Client/client/impl/AutorecoveringModel.cs b/projects/RabbitMQ.Client/client/impl/AutorecoveringModel.cs
index 0adce230fc..bb740bc88b 100644
--- a/projects/RabbitMQ.Client/client/impl/AutorecoveringModel.cs
+++ b/projects/RabbitMQ.Client/client/impl/AutorecoveringModel.cs
@@ -1960,5 +1960,15 @@ public IBasicPublishBatch CreateBasicPublishBatch()
return ((IFullModel)_delegate).CreateBasicPublishBatch();
}
+
+ public IBasicPublishBatch CreateBasicPublishBatch(int sizeHint)
+ {
+ if (_disposed)
+ {
+ throw new ObjectDisposedException(GetType().FullName);
+ }
+
+ return ((IFullModel)_delegate).CreateBasicPublishBatch(sizeHint);
+ }
}
}
diff --git a/projects/RabbitMQ.Client/client/impl/BasicPublishBatch.cs b/projects/RabbitMQ.Client/client/impl/BasicPublishBatch.cs
index 09cf54eb01..d8f5bf4fcf 100644
--- a/projects/RabbitMQ.Client/client/impl/BasicPublishBatch.cs
+++ b/projects/RabbitMQ.Client/client/impl/BasicPublishBatch.cs
@@ -38,21 +38,27 @@
// Copyright (c) 2007-2020 VMware, Inc. All rights reserved.
//---------------------------------------------------------------------------
-using System;
-using System.Buffers;
using System.Collections.Generic;
using RabbitMQ.Client.Framing.Impl;
namespace RabbitMQ.Client.Impl
{
- class BasicPublishBatch : IBasicPublishBatch
+ internal sealed class BasicPublishBatch : IBasicPublishBatch
{
- private readonly List _commands = new List();
+ private readonly List _commands;
private readonly ModelBase _model;
+
internal BasicPublishBatch (ModelBase model)
{
_model = model;
+ _commands = new List();
+ }
+
+ internal BasicPublishBatch (ModelBase model, int sizeHint)
+ {
+ _model = model;
+ _commands = new List(sizeHint);
}
public void Add(string exchange, string routingKey, bool mandatory, IBasicProperties basicProperties, byte[] body)
diff --git a/projects/RabbitMQ.Client/client/impl/ModelBase.cs b/projects/RabbitMQ.Client/client/impl/ModelBase.cs
index 7e4fc95ded..9a262a5731 100644
--- a/projects/RabbitMQ.Client/client/impl/ModelBase.cs
+++ b/projects/RabbitMQ.Client/client/impl/ModelBase.cs
@@ -1202,6 +1202,11 @@ public IBasicPublishBatch CreateBasicPublishBatch()
return new BasicPublishBatch(this);
}
+ public IBasicPublishBatch CreateBasicPublishBatch(int sizeHint)
+ {
+ return new BasicPublishBatch(this, sizeHint);
+ }
+
public void ExchangeBind(string destination,
string source,
diff --git a/projects/Unit/TestBasicPublishBatch.cs b/projects/Unit/TestBasicPublishBatch.cs
index 8fb63547af..8ad731141b 100644
--- a/projects/Unit/TestBasicPublishBatch.cs
+++ b/projects/Unit/TestBasicPublishBatch.cs
@@ -62,5 +62,39 @@ public void TestBasicPublishBatchSend()
BasicGetResult resultB = Model.BasicGet("test-message-batch-b", true);
Assert.NotNull(resultB);
}
+
+ [Test]
+ public void TestBasicPublishBatchSendWithSizeHint()
+ {
+ Model.ConfirmSelect();
+ Model.QueueDeclare(queue: "test-message-batch-a", durable: false);
+ Model.QueueDeclare(queue: "test-message-batch-b", durable: false);
+ IBasicPublishBatch batch = Model.CreateBasicPublishBatch(2);
+ batch.Add("", "test-message-batch-a", false, null, new byte [] {});
+ batch.Add("", "test-message-batch-b", false, null, new byte [] {});
+ batch.Publish();
+ Model.WaitForConfirmsOrDie(TimeSpan.FromSeconds(15));
+ BasicGetResult resultA = Model.BasicGet("test-message-batch-a", true);
+ Assert.NotNull(resultA);
+ BasicGetResult resultB = Model.BasicGet("test-message-batch-b", true);
+ Assert.NotNull(resultB);
+ }
+
+ [Test]
+ public void TestBasicPublishBatchSendWithWrongSizeHint()
+ {
+ Model.ConfirmSelect();
+ Model.QueueDeclare(queue: "test-message-batch-a", durable: false);
+ Model.QueueDeclare(queue: "test-message-batch-b", durable: false);
+ IBasicPublishBatch batch = Model.CreateBasicPublishBatch(1);
+ batch.Add("", "test-message-batch-a", false, null, new byte [] {});
+ batch.Add("", "test-message-batch-b", false, null, new byte [] {});
+ batch.Publish();
+ Model.WaitForConfirmsOrDie(TimeSpan.FromSeconds(15));
+ BasicGetResult resultA = Model.BasicGet("test-message-batch-a", true);
+ Assert.NotNull(resultA);
+ BasicGetResult resultB = Model.BasicGet("test-message-batch-b", true);
+ Assert.NotNull(resultB);
+ }
}
}