diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/multi_tenancy_internals.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/multi_tenancy_internals.cs index 3ff5d9c7d..c9a4dcc1e 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/multi_tenancy_internals.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Internals/multi_tenancy_internals.cs @@ -67,7 +67,35 @@ public void add_tenant_by_explicit_configuration() var transport = new RabbitMqTransport(); var expression = new RabbitMqTransportExpression(transport, new WolverineOptions()); expression.AddTenant("one", c => c.HostName = "server2"); - + transport.Tenants["one"].Transport.ConnectionFactory.HostName.ShouldBe("server2"); } -} \ No newline at end of file + + [Fact] + public void global_dead_letter_queueing_applies_to_new_tenants() + { + var transport = new RabbitMqTransport(); + transport.ConfigureFactory(_ => { }); + var expression = new RabbitMqTransportExpression(transport, new WolverineOptions()); + + expression.CustomizeDeadLetterQueueing(new DeadLetterQueue("errors")); + expression.AddTenant("one", "vh1"); + + var tenantTransport = transport.Tenants["one"].Compile(transport); + tenantTransport.DeadLetterQueue.QueueName.ShouldBe("errors"); + } + + [Fact] + public void global_dead_letter_queueing_applies_to_existing_tenants() + { + var transport = new RabbitMqTransport(); + transport.ConfigureFactory(_ => { }); + var expression = new RabbitMqTransportExpression(transport, new WolverineOptions()); + + expression.AddTenant("one", "vh1"); + expression.CustomizeDeadLetterQueueing(new DeadLetterQueue("errors")); + + var tenantTransport = transport.Tenants["one"].Compile(transport); + tenantTransport.DeadLetterQueue.QueueName.ShouldBe("errors"); + } +} diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqTenant.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqTenant.cs index a67c864ee..907c716be 100644 --- a/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqTenant.cs +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ/Internal/RabbitMqTenant.cs @@ -28,13 +28,13 @@ public RabbitMqTransport Compile(RabbitMqTransport parent) if (VirtualHostName.IsNotEmpty()) { var props = typeof(ConnectionFactory).GetProperties(); - + Transport.ConfigureFactory(f => { foreach (var prop in props) { if (!prop.CanWrite) continue; - + prop.SetValue(f, prop.GetValue(parent.ConnectionFactory)); } @@ -42,12 +42,25 @@ public RabbitMqTransport Compile(RabbitMqTransport parent) }); } + CloneDeadLetterQueue(parent); + return Transport!; } + private void CloneDeadLetterQueue(RabbitMqTransport parent) + { + // Copy the parent dead letter queue configuration to the tenant + Transport.DeadLetterQueue.Mode = parent.DeadLetterQueue.Mode; + Transport.DeadLetterQueue.QueueName = parent.DeadLetterQueue.QueueName; + Transport.DeadLetterQueue.ExchangeName = parent.DeadLetterQueue.ExchangeName; + Transport.DeadLetterQueue.BindingName = parent.DeadLetterQueue.BindingName; + Transport.DeadLetterQueue.ConfigureQueue = parent.DeadLetterQueue.ConfigureQueue; + Transport.DeadLetterQueue.ConfigureExchange = parent.DeadLetterQueue.ConfigureExchange; + } + public Task ConnectAsync(RabbitMqTransport parent, IWolverineRuntime runtime) { Compile(parent); return Transport.ConnectAsync(runtime).AsTask(); } -} \ No newline at end of file +}