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); + } } }