Adds azure service bus to mocha#9578
Open
PascalSenn wants to merge 17 commits intomainfrom
Open
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
Adds an Azure Service Bus transport implementation to Mocha, including topology provisioning, middleware integration, and a full integration-test suite plus an Aspire-based example app for local emulation.
Changes:
- Introduces
Mocha.Transport.AzureServiceBustransport with descriptors, topology model/provisioning, client manager, and receive/dispatch endpoints. - Adds Azure Service Bus integration tests covering publish/subscribe, send, request/reply, middleware ordering, error queues, batching, and concurrency.
- Adds an Aspire example solution showing multi-service interaction via the Azure Service Bus emulator.
Reviewed changes
Copilot reviewed 123 out of 123 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Mocha.Transport.AzureServiceBus.Tests.csproj | New test project for Azure Service Bus transport |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Helpers/TestBus.cs | Test harness helpers to build/start/stop a bus |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Helpers/AzureServiceBusFixture.cs | Squadron-based Service Bus fixture + per-test naming isolation |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/TransportMiddlewareTests.cs | Verifies transport-level middleware registration/order |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/SendTests.cs | Verifies point-to-point send routing and keyed handlers |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/RequestReplyTests.cs | Verifies request/reply semantics and correlation under concurrency |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/PublishSubscribeTests.cs | Verifies publish fan-out and rapid-fire delivery |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/FaultHandlingTests.cs | Verifies remote error propagation and handler isolation after faults |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/ExplicitTopologyTests.cs | Verifies explicit topology declarations + routing |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/ErrorQueueTests.cs | Verifies fault routing to error queue and fault headers/body preservation |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/EndpointMiddlewareTests.cs | Verifies endpoint-level middleware registration/order |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/CustomHeaderTests.cs | Verifies custom header propagation via application properties |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/ConnectionRecoveryTests.cs | Verifies behavior across transport teardown/restart |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/ConcurrencyTests.cs | Verifies endpoint concurrency limits and observed overlap |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/ConcurrencyLimiterTests.cs | Verifies global concurrency limiter integration |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/BusDefaultsIntegrationTests.cs | Verifies bus-level defaults propagation/override behavior |
| src/Mocha/test/Mocha.Transport.AzureServiceBus.Tests/Behaviors/BatchingTests.cs | Verifies batch handler delivery by size/time and under concurrency |
| src/Mocha/src/Mocha/Assembly.cs | Grants internals visibility for transport + tests |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Mocha.Transport.AzureServiceBus.csproj | New transport project + Azure SDK dependencies |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Assembly.cs | InternalsVisibleTo for the transport’s test project |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/MessageBusBuilderExtensions.cs | Public AddAzureServiceBus(...) registration extensions |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Connection/AzureServiceBusClientManager.cs | Manages ServiceBusClient, sender cache, admin client |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Configurations/AzureServiceBusTransportConfiguration.cs | Transport config: connection, retry, topology, defaults |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Configurations/AzureServiceBusReceiveEndpointConfiguration.cs | Receive endpoint config: queue + prefetch |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Configurations/AzureServiceBusDispatchEndpointConfiguration.cs | Dispatch endpoint config: queue vs topic destination |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Configurations/AzureServiceBusDefaultTopicOptions.cs | Default topic provisioning options |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Configurations/AzureServiceBusDefaultQueueOptions.cs | Default queue provisioning options |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Configurations/AzureServiceBusDefaultEndpointOptions.cs | Default receive endpoint options (prefetch/concurrency) |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Configurations/AzureServiceBusBusDefaults.cs | Aggregates bus-level defaults for queue/topic/endpoint |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Descriptors/IAzureServiceBusMessagingTransportDescriptor.cs | Fluent API for transport configuration |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Descriptors/IAzureServiceBusReceiveEndpointDescriptor.cs | Fluent API for receive endpoint config |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Descriptors/IAzureServiceBusDispatchEndpointDescriptor.cs | Fluent API for dispatch endpoint config |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Descriptors/AzureServiceBusMessagingTransportDescriptor.cs | Collects declarations and builds transport configuration |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Descriptors/AzureServiceBusReceiveEndpointDescriptor.cs | Receive endpoint descriptor implementation |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Descriptors/AzureServiceBusDispatchEndpointDescriptor.cs | Dispatch endpoint descriptor implementation |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/IAzureServiceBusResource.cs | Abstraction for provisionable ASB resources |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/Extensions/AzureServiceBusTransportDescriptorExtensions.cs | Registers default conventions + middleware for ASB transport |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/Descriptors/IAzureServiceBusTopicDescriptor.cs | Fluent API for topic declarations |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/Descriptors/IAzureServiceBusQueueDescriptor.cs | Fluent API for queue declarations |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/Descriptors/IAzureServiceBusSubscriptionDescriptor.cs | Fluent API for subscription declarations |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/Descriptors/AzureServiceBusTopicDescriptor.cs | Topic descriptor implementation |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/Descriptors/AzureServiceBusQueueDescriptor.cs | Queue descriptor implementation |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/Descriptors/AzureServiceBusSubscriptionDescriptor.cs | Subscription descriptor implementation |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/Configurations/AzureServiceBusTopicConfiguration.cs | Topic topology configuration model |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/Configurations/AzureServiceBusQueueConfiguration.cs | Queue topology configuration model |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/Configurations/AzureServiceBusSubscriptionConfiguration.cs | Subscription topology configuration model |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/AzureServiceBusMessagingTopology.cs | In-memory topology graph + defaults application |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/AzureServiceBusTopic.cs | Topic resource + best-effort provisioning |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/AzureServiceBusQueue.cs | Queue resource + best-effort provisioning |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Topology/AzureServiceBusSubscription.cs | Subscription resource + forwarding provisioning |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Conventions/IAzureServiceBusReceiveEndpointTopologyConvention.cs | Convention interface for receive-endpoint topology discovery |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Conventions/IAzureServiceBusDispatchEndpointTopologyConvention.cs | Convention interface for dispatch-endpoint topology discovery |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Conventions/IAzureServiceBusReceiveEndpointConfigurationConvention.cs | Convention interface for ASB endpoint configuration |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Conventions/AzureServiceBusReceiveEndpointTopologyConvention.cs | Default topology discovery for receive endpoints |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Conventions/AzureServiceBusDispatchEndpointTopologyConvention.cs | Default topology discovery for dispatch endpoints |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Conventions/AzureServiceBusDefaultReceiveEndpointConvention.cs | Applies queue/error/skipped defaults and bus defaults |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Middlewares/Receive/AzureServiceBusReceiveMiddlewares.cs | Exposes preconfigured receive middleware configurations |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Middlewares/Receive/AzureServiceBusAcknowledgementMiddleware.cs | Completes/abandons messages based on pipeline outcome |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Middlewares/Receive/AzureServiceBusParsingMiddleware.cs | Parses ServiceBusReceivedMessage into MessageEnvelope |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/Features/AzureServiceBusReceiveFeature.cs | Pooled feature carrying ProcessMessageEventArgs |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/AzureServiceBusReceiveEndpoint.cs | ServiceBusProcessor-based receive endpoint implementation |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/AzureServiceBusDispatchEndpoint.cs | Sender-based dispatch endpoint implementation + provisioning |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/AzureServiceBusMessageHeaders.cs | Defines internal ASB application-property header keys |
| src/Mocha/src/Mocha.Transport.AzureServiceBus/AzureServiceBusMessageEnvelopeParser.cs | Maps ASB message to normalized envelope + user headers |
| src/Mocha/examples/AzureServiceBusTransport/aspire.config.json | Aspire example configuration entrypoint |
| src/Mocha/examples/AzureServiceBusTransport/Directory.Build.props | Example-level build props (TFM override) |
| src/Mocha/examples/AzureServiceBusTransport/Directory.Packages.props | Example-level central package versions |
| src/Mocha/examples/AzureServiceBusTransport/.aspire/settings.json | Aspire local settings pointing to AppHost |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.AppHost/AzureServiceBusTransport.AppHost.csproj | AppHost project wiring services + emulator |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.AppHost/AppHost.cs | Emulator entity pre-definition via Config.json mutation |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.AppHost/appsettings.json | AppHost logging settings |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.AppHost/appsettings.Development.json | AppHost dev logging settings |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.AppHost/Properties/launchSettings.json | AppHost launch profiles |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.ServiceDefaults/AzureServiceBusTransport.ServiceDefaults.csproj | Shared “service defaults” project for example |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.ServiceDefaults/Extensions.cs | OpenTelemetry, health checks, service discovery defaults |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.Contracts/AzureServiceBusTransport.Contracts.csproj | Example contracts assembly |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.Contracts/Events/OrderPlacedEvent.cs | Example event contract |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.Contracts/Events/OrderShippedEvent.cs | Example event contract |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.Contracts/Commands/PrepareShipmentCommand.cs | Example request contract (request/reply) |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.Contracts/Commands/ShipmentPreparedResponse.cs | Example response contract |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.Contracts/Commands/ProcessOrderCommand.cs | Example command contract |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.Contracts/Commands/FulfillOrderRequest.cs | Example saga entry request |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.Contracts/Commands/FulfillOrderResponse.cs | Example saga final response |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.Contracts/Requests/GetOrderStatusRequest.cs | Example request contract |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.Contracts/Requests/GetOrderStatusResponse.cs | Example response contract |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/AzureServiceBusTransport.OrderService.csproj | Example order service |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/appsettings.json | Order service logging settings |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/appsettings.Development.json | Order service dev logging settings |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Properties/launchSettings.json | Order service launch profiles |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/OrderSimulatorWorker.cs | Example background order generator |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Sagas/OrderFulfillmentState.cs | Example saga state |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Sagas/OrderFulfillmentSaga.cs | Example saga orchestration using request/reply + publish |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Mediator/Commands/PlaceOrderCommand.cs | Example mediator command + result |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Mediator/Commands/PlaceOrderCommandHandler.cs | Publishes cross-service event from mediator command |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Mediator/Queries/GetOrderDetailsQuery.cs | Example mediator query + response model |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Mediator/Queries/GetOrderDetailsQueryHandler.cs | Example query handler |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Mediator/Notifications/OrderActivityNotification.cs | Example mediator notification |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Mediator/Notifications/OrderActivityNotificationHandler.cs | Example notification handler |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Handlers/ProcessOrderCommandHandler.cs | Example event handler |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Handlers/OrderShippedEventHandler.cs | Example event handler |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Handlers/OrderAnalyticsBatchHandler.cs | Example batch event handler |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.OrderService/Handlers/GetOrderStatusRequestHandler.cs | Example request handler |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.ShippingService/AzureServiceBusTransport.ShippingService.csproj | Example shipping service |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.ShippingService/appsettings.json | Shipping service logging settings |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.ShippingService/appsettings.Development.json | Shipping service dev logging settings |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.ShippingService/Properties/launchSettings.json | Shipping service launch profiles |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.ShippingService/Program.cs | Shipping service endpoints + ASB wiring |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.ShippingService/Handlers/OrderPlacedEventHandler.cs | Shipping service event handler |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.ShippingService/Handlers/PrepareShipmentRequestHandler.cs | Shipping service request handler |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.NotificationService/AzureServiceBusTransport.NotificationService.csproj | Example notification service |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.NotificationService/appsettings.json | Notification service logging settings |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.NotificationService/appsettings.Development.json | Notification service dev logging settings |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.NotificationService/Properties/launchSettings.json | Notification service launch profiles |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.NotificationService/Program.cs | Notification service ASB wiring |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.NotificationService/Handlers/OrderPlacedNotificationHandler.cs | Notification handler for placed events |
| src/Mocha/examples/AzureServiceBusTransport/AzureServiceBusTransport.NotificationService/Handlers/OrderShippedNotificationHandler.cs | Notification handler for shipped events |
| src/Mocha/Mocha.slnx | Adds transport + test projects to solution |
| src/Directory.Packages.props | Adds Squadron Azure Service Bus package version |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Wires the ASB transport into Mocha's post-merge scheduling contracts and
adds first-class native dead-lettering:
- Native scheduling: transport declares SupportsSchedulingNatively;
dispatch endpoint branches on envelope.ScheduledTime and calls
sender.ScheduleMessageAsync, populating ScheduledMessageFeature.Token
as "asb:{entity}:{seq}". New AzureServiceBusScheduledMessageStore
implements IScheduledMessageStore for CancelAsync via
sender.CancelScheduledMessageAsync(sequenceNumber).
- Native dead-lettering (power-user): new IAzureServiceBusMessageContext
with DeadLetterAsync(reason, description, props) and
AbandonAsync(propertiesToModify), accessed via ctx.AzureServiceBus().
Pooled on the existing AzureServiceBusReceiveFeature — zero extra
allocation.
- Idempotent settlement: AzureServiceBusAcknowledgementMiddleware now
wraps Complete/Abandon with a MessageLockLost catch so handler-
initiated DeadLetterAsync no longer races the outer ack attempt.
- Opt-in native DLQ forwarding: new UseNativeDeadLetterForwarding()
descriptor method wires queue.ForwardDeadLetteredMessagesTo to the
endpoint's _error queue, so MaxDeliveryCountExceeded messages land
in the Mocha-managed error queue instead of $DeadLetterQueue.
Conflict-detected at provisioning.
Also includes refinements to the cross-transport _skipped fix
(ReceiveDeadLetterMiddleware now targets SkippedEndpoint, previously
committed in a494e39).
Adds docs for the native scheduling integration, IAzureServiceBusMessageContext power-user API, UseNativeDeadLetterForwarding(), and the _skipped semantic fix. Creates transports/azure-service-bus.md; updates scheduling.md, routing-and-endpoints.md, and transports/index.md.
Captures the design plan (plan.md) and the planning fanout artifacts (.work/plan/: scout reports, divergent approach proposals, cross-reviews, synthesis + reviewer + devil's advocate critiques) produced while scoping this PR.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary of the changes (Less than 80 chars)
Closes #bugnumber (in this specific format)