From 07bc3b664461c2e688c1f8eb32573539301e2868 Mon Sep 17 00:00:00 2001 From: Olivier Le Pichon Date: Wed, 26 Mar 2025 12:56:13 +0100 Subject: [PATCH] Make public QueueNameTransformationUsedByDeclareQueue --- src/MerQure.RbMQ/MessagingService.cs | 24 +++++++++--------- src/MerQure/IMessagingService.cs | 25 +++++++++++++------ .../RetryBusServiceTests.cs | 10 +++++--- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/MerQure.RbMQ/MessagingService.cs b/src/MerQure.RbMQ/MessagingService.cs index ab3740e..539a8ec 100644 --- a/src/MerQure.RbMQ/MessagingService.cs +++ b/src/MerQure.RbMQ/MessagingService.cs @@ -48,20 +48,20 @@ public void DeclareExchange(string exchangeName, string exchangeType) } } - public string DeclareQueue(string queueName, byte maxPriority, bool isQuorum) + public string DeclareQueue(string proposedQueueName, byte maxPriority, bool isQuorum) { var queueArgs = new Dictionary { { Constants.QueueMaxPriority, maxPriority } }; - return DeclareQueue(queueName, queueArgs, isQuorum); + return DeclareQueue(proposedQueueName, queueArgs, isQuorum); } - public string DeclareQueue(string queueName, bool isQuorum) + public string DeclareQueue(string proposedQueueName, bool isQuorum) { - return DeclareQueue(queueName, new Dictionary(), isQuorum); + return DeclareQueue(proposedQueueName, new Dictionary(), isQuorum); } - public string DeclareQueueWithDeadLetterPolicy(string queueName, string deadLetterExchange, int messageTimeToLive, string deadLetterRoutingKey, bool isQuorum) + public string DeclareQueueWithDeadLetterPolicy(string proposedQueueName, string deadLetterExchange, int messageTimeToLive, string deadLetterRoutingKey, bool isQuorum) { if (string.IsNullOrWhiteSpace(deadLetterExchange)) throw new ArgumentNullException(nameof(deadLetterExchange)); if (messageTimeToLive <= 0) throw new ArgumentOutOfRangeException(nameof(messageTimeToLive)); @@ -74,17 +74,19 @@ public string DeclareQueueWithDeadLetterPolicy(string queueName, string deadLett { queueArgs.Add(Constants.QueueDeadLetterRoutingKey, deadLetterRoutingKey); } - return DeclareQueue(queueName, queueArgs, isQuorum); + return DeclareQueue(proposedQueueName, queueArgs, isQuorum); } - private const string QuorumQueueNameSuffix ="-q"; - public string DeclareQueue(string queueName, Dictionary queueArgs, bool isQuorum) + public const string QuorumQueueNameSuffix ="-q"; + public string QueueNameTransformationUsedByDeclareQueue(string proposedQueueName, bool isQuorum) => isQuorum ? $"{proposedQueueName}{QuorumQueueNameSuffix}" : proposedQueueName; + + public string DeclareQueue(string proposedQueueName, Dictionary queueArgs, bool isQuorum) { - if (string.IsNullOrWhiteSpace(queueName)) throw new ArgumentNullException(nameof(queueName)); + if (string.IsNullOrWhiteSpace(proposedQueueName)) throw new ArgumentNullException(nameof(proposedQueueName)); if (queueArgs == null) throw new ArgumentNullException(nameof(queueArgs)); + string effectiveQueueName = QueueNameTransformationUsedByDeclareQueue(proposedQueueName, isQuorum);; Dictionary effectiveQueueArgs; - string effectiveQueueName; if(isQuorum) { if(!Durable || AutoDeleteQueue) @@ -95,12 +97,10 @@ public string DeclareQueue(string queueName, Dictionary queueArg { { Constants.HeaderQueueType, Constants.HeaderQueueTypeQuorumValue } }; - effectiveQueueName = $"{queueName}{QuorumQueueNameSuffix}"; } else { effectiveQueueArgs = queueArgs; - effectiveQueueName = queueName; } using (var channel = CurrentConnection.CreateModel()) diff --git a/src/MerQure/IMessagingService.cs b/src/MerQure/IMessagingService.cs index 8c84a82..9a23ae8 100644 --- a/src/MerQure/IMessagingService.cs +++ b/src/MerQure/IMessagingService.cs @@ -20,33 +20,44 @@ public interface IMessagingService /// fanout, direct, topic, headers void DeclareExchange(string exchangeName, string exchangeType); + /// + /// Implementation of name transformation between proposedQueueName and queue name effectively used made by each DeclareQueueXxxx method + /// + /// + /// + /// Effective queue name + string QueueNameTransformationUsedByDeclareQueue(string proposedQueueName, bool isQuorum); + /// /// Declare a queue with dead letter policy /// - /// + /// Proposed queue name (will be transformetransformed by ) /// /// /// /// Whether created queue should be quorum (when true, quorum arguments will be added to arguments used for queue creation) /// - string DeclareQueueWithDeadLetterPolicy(string queueName, string deadLetterExchange, int messageTimeToLive, string deadLetterRoutingKey, bool isQuorum); + /// Effective queue name used by created queue + string DeclareQueueWithDeadLetterPolicy(string proposedQueueName, string deadLetterExchange, int messageTimeToLive, string deadLetterRoutingKey, bool isQuorum); - string DeclareQueue(string queueName, byte maxPriority, bool isQuorum); + string DeclareQueue(string proposedQueueName, byte maxPriority, bool isQuorum); /// /// Declare a queue (if it doesn't exists) with specific arguments /// - /// + /// Proposed queue name (transformed by ) /// Queue's arguments /// Whether created queue should be quorum (when true, quorum arguments will be added to arguments used for queue creation) - string DeclareQueue(string queueName, Dictionary queueArgs, bool isQuorum); + /// Effective queue name used by created queue + string DeclareQueue(string proposedQueueName, Dictionary queueArgs, bool isQuorum); /// /// Declare a queue (if it doesn't exists) /// - /// + /// Proposed queue name (transformed by ) /// Whether created queue should be quorum (when true, quorum arguments will be added to arguments used for queue creation) - string DeclareQueue(string queueName, bool isQuorum); + /// Effective queue name used by created queue + string DeclareQueue(string proposedQueueName, bool isQuorum); /// /// Declare an Binding (if it doesn't exists) diff --git a/tests/MerQure.Tools.Tests/RetryBusServiceTests.cs b/tests/MerQure.Tools.Tests/RetryBusServiceTests.cs index 54da18a..58e40e2 100644 --- a/tests/MerQure.Tools.Tests/RetryBusServiceTests.cs +++ b/tests/MerQure.Tools.Tests/RetryBusServiceTests.cs @@ -2,6 +2,7 @@ using Moq; using System; using System.Collections.Generic; +using MerQure.RbMQ; using Xunit; namespace MerQure.Tools.Tests @@ -21,9 +22,12 @@ public class RetryBusServiceTests : IDisposable public RetryBusServiceTests() { _mockMessagingService = new Mock(); + _mockMessagingService + .Setup(service => service.QueueNameTransformationUsedByDeclareQueue(It.IsAny(), It.IsAny())) + .Returns((string proposedQueueName, bool isQuorum) => isQuorum ? $"{proposedQueueName}{MessagingService.QuorumQueueNameSuffix}" : proposedQueueName); _mockMessagingService .Setup(service => service.DeclareQueue(It.IsAny(), It.IsAny())) - .Returns((string queueName, bool isQuorum) => isQuorum ? queueName + "-q" : queueName); + .Returns((string proposedQueueName, bool isQuorum) => isQuorum ? $"{proposedQueueName}{MessagingService.QuorumQueueNameSuffix}" : proposedQueueName); _retryBusService = new RetryBusService(_mockMessagingService.Object); } @@ -111,8 +115,8 @@ public void RetryBusService_CreateNewBus_quorum_ShouldDeclareBindingForeachChann _retryBusService.CreateNewBus(retryStrategy, isQuorum: true); //Assert - _mockMessagingService.Verify(m => m.DeclareBinding(retryStrategy.BusName, $"{_channelNames[0]}-q", It.IsAny())); - _mockMessagingService.Verify(m => m.DeclareBinding(retryStrategy.BusName, $"{_channelNames[1]}-q", It.IsAny())); + _mockMessagingService.Verify(m => m.DeclareBinding(retryStrategy.BusName, $"{_channelNames[0]}{MessagingService.QuorumQueueNameSuffix}", It.IsAny())); + _mockMessagingService.Verify(m => m.DeclareBinding(retryStrategy.BusName, $"{_channelNames[1]}{MessagingService.QuorumQueueNameSuffix}", It.IsAny())); } [Theory]