Stratara.Outbox.RabbitMQ
3.1.5
Prefix Reserved
See the version list below for details.
dotnet add package Stratara.Outbox.RabbitMQ --version 3.1.5
NuGet\Install-Package Stratara.Outbox.RabbitMQ -Version 3.1.5
<PackageReference Include="Stratara.Outbox.RabbitMQ" Version="3.1.5" />
<PackageVersion Include="Stratara.Outbox.RabbitMQ" Version="3.1.5" />
<PackageReference Include="Stratara.Outbox.RabbitMQ" />
paket add Stratara.Outbox.RabbitMQ --version 3.1.5
#r "nuget: Stratara.Outbox.RabbitMQ, 3.1.5"
#:package Stratara.Outbox.RabbitMQ@3.1.5
#addin nuget:?package=Stratara.Outbox.RabbitMQ&version=3.1.5
#tool nuget:?package=Stratara.Outbox.RabbitMQ&version=3.1.5
Stratara.Outbox.RabbitMQ
License: FSL-1.1-MIT (Functional Source License — source-available; converts to MIT after 2 years). Not OSI-approved OSS.
Outbox-pattern command + event dispatch for the Stratara event-sourced stack with a RabbitMQ / Azure Service Bus message-bus implementation. Contains the write-side dispatchers, the outbox-retry worker, the read-side mediator command worker, the message-bus implementations, and the Redis-backed ProjectionReplayState that coordinates dispatch skip during projection replay.
What's in the box
| Folder | Contents |
|---|---|
Outbox/ |
OutboxOptions, CommandOutboxDispatcher (write-side ICommand fan-out via IMessageBus, falls back to outbox table on bus failure), EventBundleOutboxDispatcher (same for EventBundle), OutboxWorker (hosted service that retries unpublished outbox rows on a polling interval), NullOutboxLock + RedisOutboxLock (IOutboxLock implementations — default no-op for single-instance deployments, Redis-leased distributed lock for multi-replica setups) |
Messaging/ |
RabbitMqBus — IMessageBus over RabbitMQ. Azure Service Bus ships as the sibling Stratara.Outbox.AzureServiceBus package. |
Mediator/ |
MediatorCommandWorker (hosted service that subscribes to the command topic and dispatches into the in-process IMediator) |
Projections/ |
ProjectionReplayState (Redis-backed concrete IProjectionReplayState; dispatchers skip publishing while replay is active) |
DependencyInjection/ |
AddOutboxDispatcher(), AddOutboxWorker(IConfiguration), AddRedisOutboxLock() (opt-in distributed lock), AddProjectionReplayState(), AddMediatorWorker(), AddMessaging() |
Diagnostics/Extensions/ |
LoggerOutboxExtensions, LoggerMessagingExtensions (source-generated logger surfaces) |
Quick start
// In your API host:
builder.AddMessaging(); // IMessageBus + MessagingOptions binding
builder.Services
.AddOutboxDispatcher() // CommandOutboxDispatcher + EventBundleOutboxDispatcher + ProjectionReplayState
.AddOutboxWorker(builder.Configuration); // OutboxWorker hosted service (only if this host owns retries)
// In your command worker:
builder.Services
.AddMediatorWorker(); // MediatorCommandWorker hosted service
The dispatchers consult IProjectionReplayState.IsReplayActive before each publish and skip dispatch (writing to the outbox table only) while a replay is in progress.
Multi-instance outbox workers
AddOutboxWorker registers NullOutboxLock as the default IOutboxLock — a no-op that preserves the single-instance assumption. For multi-replica deployments call AddRedisOutboxLock() afterwards; it replaces the no-op with a Redis-leased lock (SET stratara:outbox:lock NX EX) so only one replica drains at a time:
builder.AddCaching(); // registers IConnectionMultiplexer
builder.Services
.AddOutboxDispatcher()
.AddOutboxWorker(builder.Configuration)
.AddRedisOutboxLock(); // multi-replica safe
The lease defaults to 60 s (OutboxOptions.LockLeaseSeconds). Tune it so it exceeds the worst-case drain duration; otherwise the lock can expire mid-cycle and a peer may start a concurrent drain. Outbox semantics are still at-least-once, so a duplicate publish is recoverable provided handlers stay idempotent.
Dependencies
Stratara.Abstractions— forICommand,IEvent,IMessageBus,ICommandOutboxDispatcher,IEventBundleOutboxDispatcher,IProjectionReplayState,IMessagingIdentifier,IWriteUnitOfWork(used at runtime via the outbox repository).Stratara.Contracts— forEventBundle+CommandEnvelopemessages.Stratara.Mediator—MediatorCommandWorkerdispatches into the in-processIMediator.Stratara.Sessions— dispatcher hydratesCommandEnvelopefrom the current session context.Stratara.Shared— for messaging primitives, resilience pipeline names, mapping helpers, and the diagnostics base.RabbitMQ.Client,StackExchange.Redis(replay-state + optional outbox-lock).Microsoft.Extensions.Hosting.Abstractions+Microsoft.Extensions.Options.ConfigurationExtensions— for hosted services + options binding.
The outbox dispatcher persists rows through
IWriteUnitOfWork.CreateOutboxRepository— that interface lives inStratara.Abstractions, but the concrete implementation comes fromStratara.EventSourcing.EntityFrameworkCore. Reference that package alongside this one to get a working stack.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.8)
- Microsoft.Extensions.DependencyInjection (>= 10.0.8)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.8)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.8)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 10.0.8)
- RabbitMQ.Client (>= 7.2.1)
- StackExchange.Redis (>= 2.13.10)
- Stratara.Abstractions (>= 3.1.5)
- Stratara.Contracts (>= 3.1.5)
- Stratara.Mediator (>= 3.1.5)
- Stratara.Sessions (>= 3.1.5)
- Stratara.Shared (>= 3.1.5)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Stratara.Outbox.RabbitMQ:
| Package | Downloads |
|---|---|
|
Stratara.Infrastructure
Infrastructure glue for the Stratara framework — authorization decorators, configuration providers, and DI composition helpers that wire Mediator, Outbox, Identity, and EF Core into a hosted app. |
|
|
Stratara.EventSourcing.WorkerDefaults
Worker-host wiring composites for the Stratara event-sourced stack. IHostApplicationBuilder extensions (AddBackendServices, AddCommandWorkerServices, AddHeavyCommandWorkerServices, AddEventProjectionWorkerServices, AddEventStreamHashWorkerServices, AddSagaWorkerServices, AddOutboxWorkerServices) bundle the per-concern DI calls so each worker host opts in with one line. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.1.1 | 35 | 9/16/2026 |
| 4.1.0 | 49 | 9/16/2026 |
| 4.0.4 | 410 | 9/14/2026 |
| 4.0.3 | 173 | 9/3/2026 |
| 4.0.2 | 607 | 9/3/2026 |
| 4.0.1 | 205 | 9/2/2026 |
| 4.0.0 | 165 | 8/31/2026 |
| 4.0.0-preview.1 | 74 | 8/31/2026 |
| 3.4.0 | 159 | 8/28/2026 |
| 3.3.0 | 125 | 8/25/2026 |
| 3.2.3 | 140 | 8/22/2026 |
| 3.2.2 | 145 | 8/14/2026 |
| 3.2.1 | 151 | 8/2/2026 |
| 3.2.0 | 142 | 7/18/2026 |
| 3.1.7 | 155 | 7/1/2026 |
| 3.1.6 | 570 | 6/22/2026 |
| 3.1.5 | 152 | 6/22/2026 |
| 3.1.4 | 153 | 6/15/2026 |
| 3.1.3 | 154 | 6/10/2026 |
| 3.1.2 | 171 | 6/5/2026 |
### Added
- **Configurable snapshot strategy** (`Stratara.Abstractions`, `Stratara.Infrastructure`) — the
snapshot cadence is no longer hard-coded. A new `Stratara.Abstractions.EventSourcing.ISnapshotStrategy`
decides, per stream, whether the event-sourcing runtime should write a snapshot:
`bool ShouldSnapshot(Type aggregateType, long currentVersion, long lastSnapshotVersion)`.
`AddEventSourcing()` registers the default `VersionThresholdSnapshotStrategy` (snapshot every 50
versions — identical to the previous behaviour) via `TryAddSingleton`, so existing consumers see no
change. To take over the policy, register your own singleton `ISnapshotStrategy` (it overrides the
default whether registered before or after `AddEventSourcing()`): vary the threshold per aggregate
type, construct `new VersionThresholdSnapshotStrategy(threshold)` for a different uniform cadence, or
register `NoSnapshotStrategy` to disable snapshotting entirely. This replaces the previously
hard-coded `UseSnapshots`/`SnapshotRange` constants in the default snapshot service, which were not
actually configurable despite the documentation implying they were.
- **`AddDomainEventTypesFromAssemblyContaining<T>()`** (`Stratara.Abstractions`) — registers *only* the
domain event types consumed by an assembly's aggregate `Apply(TEvent)` methods in the trusted-type
resolver, without registering the aggregate types themselves and without pulling any projection / saga
/ command-handler classes into DI. Use it in a host that only needs to deserialize event payloads off
the message bus or event stream — typically a dedicated projection or saga worker — but must not wire
the handler classes (and their runtime dependencies) that `AddProjectionsFromAssemblyContaining<T>`
would register. Complements the existing `AddAggregatesFromAssemblyContaining<T>` (which additionally
registers the aggregate types) and `AddTrustedType<T>` (single type).