diff --git a/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_2304_conventional_routing_ignores_durable_outbox_policy.cs b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_2304_conventional_routing_ignores_durable_outbox_policy.cs new file mode 100644 index 000000000..bfb553b0b --- /dev/null +++ b/src/Transports/RabbitMQ/Wolverine.RabbitMQ.Tests/Bugs/Bug_2304_conventional_routing_ignores_durable_outbox_policy.cs @@ -0,0 +1,75 @@ +using IntegrationTests; +using Marten; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Shouldly; +using Wolverine.ComplianceTests; +using Wolverine.Configuration; +using Wolverine.Marten; +using Wolverine.Runtime; +using Wolverine.Runtime.Routing; +using Xunit; + +namespace Wolverine.RabbitMQ.Tests.Bugs; + +public class Bug_2304_conventional_routing_ignores_durable_outbox_policy : IDisposable +{ + private readonly IHost _host; + + public Bug_2304_conventional_routing_ignores_durable_outbox_policy() + { + _host = WolverineHost.For(opts => + { + opts.Services.AddMarten(m => + { + m.Connection(Servers.PostgresConnectionString); + m.DisableNpgsqlLogging = true; + }) + .IntegrateWithWolverine(); + + opts.UseRabbitMq() + .UseConventionalRouting() + .AutoProvision() + .AutoPurgeOnStartup(); + + opts.Policies.UseDurableOutboxOnAllSendingEndpoints(); + + opts.DisableConventionalDiscovery(); + }); + } + + [Fact] + public void conventionally_routed_endpoint_should_be_durable() + { + var runtime = _host.Services.GetRequiredService(); + + var routes = runtime.RoutingFor(typeof(Bug2304Message)) + .ShouldBeOfType>() + .Routes; + + routes.Length.ShouldBeGreaterThan(0); + + var route = routes.Single().ShouldBeOfType(); + var endpoint = route.Sender.Endpoint; + + // The endpoint should be Durable because of UseDurableOutboxOnAllSendingEndpoints() + endpoint.Mode.ShouldBe(EndpointMode.Durable); + } + + public void Dispose() + { + _host?.Dispose(); + } +} + +public class Bug2304Message; + +public class Bug2304Response; + +public static class Bug2304Handler +{ + public static void Handle(Bug2304Message message) + { + // no-op + } +} diff --git a/src/Wolverine/Transports/MessageRoutingConvention.cs b/src/Wolverine/Transports/MessageRoutingConvention.cs index a9f059505..6623b2f31 100644 --- a/src/Wolverine/Transports/MessageRoutingConvention.cs +++ b/src/Wolverine/Transports/MessageRoutingConvention.cs @@ -148,6 +148,14 @@ IEnumerable IMessageRoutingConvention.DiscoverSenders(Type messageType var (configuration, endpoint) = FindOrCreateSubscriber(corrected, transport); endpoint.EndpointName = destinationName; + // Register the subscription so that endpoint policies like + // UseDurableOutboxOnAllSendingEndpoints() recognize this as a sender + // endpoint when Compile() applies policies. See GH-2304. + if (!endpoint.Subscriptions.Any(s => s.Matches(messageType))) + { + endpoint.Subscriptions.Add(Subscription.ForType(messageType)); + } + _configureSending(configuration, new MessageRoutingContext(messageType, runtime)); configuration.As().Apply();