Stratara.Outbox.RabbitMQ
3.1.2
See the version list below for details.
dotnet add package Stratara.Outbox.RabbitMQ --version 3.1.2
NuGet\Install-Package Stratara.Outbox.RabbitMQ -Version 3.1.2
<PackageReference Include="Stratara.Outbox.RabbitMQ" Version="3.1.2" />
<PackageVersion Include="Stratara.Outbox.RabbitMQ" Version="3.1.2" />
<PackageReference Include="Stratara.Outbox.RabbitMQ" />
paket add Stratara.Outbox.RabbitMQ --version 3.1.2
#r "nuget: Stratara.Outbox.RabbitMQ, 3.1.2"
#:package Stratara.Outbox.RabbitMQ@3.1.2
#addin nuget:?package=Stratara.Outbox.RabbitMQ&version=3.1.2
#tool nuget:?package=Stratara.Outbox.RabbitMQ&version=3.1.2
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.2)
- Stratara.Contracts (>= 3.1.2)
- Stratara.Mediator (>= 3.1.2)
- Stratara.Sessions (>= 3.1.2)
- Stratara.Shared (>= 3.1.2)
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.
### Added
- **New package `Stratara.Testing`** — test doubles and assertion helpers so consumers can
unit-test Stratara-based code without Postgres or RabbitMQ testcontainers. Reference it from
test projects only.
- `AggregateTestHarness<T>` + `Aggregate.Rehydrate<T>(...)` — given/when/then rehydration of an
aggregate from events using the same reflection-based `Apply(...)` dispatch as the production
aggregation service. It throws on an event with no matching `Apply` overload so a forgotten or
mistyped overload fails the test; opt back into the production-lenient skip with
`IgnoringUnmappedEvents()`.
- `InMemoryKeyStore` — an `IKeyStore` that mints random 256-bit DEKs per `KeyScope` and supports
rotation / revocation / scope-erasure without a master KEK or key file.
- `TestBlobEncryptor.CreateAesGcm()` — the real AES-GCM `ISecureBlobEncryptor` over an
`InMemoryKeyStore`, so blob round-trips exercise production encryption.
- `InMemoryMessageBus` — an `IMessageBus` with synchronous in-process dispatch and a `Published`
list for assertions.
- `TestSessionContext` / `TestSessionContextProvider` — preset Actor/Subject `SessionContext`
values and an `ISessionContextProvider` double.
- `TestTenants.Of("acme")` — stable, deterministic tenant/user ids from readable slugs.
`TestSessionContext` sets both correlation and causation ids so the context can drive
event-store writes.
- `TestEvent.Create(payload, ...)` — wrap an event payload in `IEvent<T>` with realistic
metadata; `ProjectionTester.HandleAsync(projection, event)` — invoke a projection's private
`HandleAsync` handler directly to unit-test it against mocked repositories.
- **New package `Stratara.Testing.EntityFrameworkCore`** — spins up the **real** event-sourcing
write stack (`IEventSource`, `IAggregationService`, snapshots, the EF Core write store) against a
shared in-memory SQLite database in one call, so tests exercise production code paths without
Postgres or Docker. Reference it from test projects only.
- `EventStoreTestHost.Create(...)` — owns the SQLite connection + service provider; exposes
`ExecuteAsync(IEventSource)`, `AggregateAsync<T>(streamId)`, the preset `Session`, and the
recording `Outbox`.
- `AddStrataraTestingEventStore<TWriteDbContext>(connection, tenantId)` — the lower-level DI
extension; `StrataraTestWriteDbContext` — a ready-made concrete write context;
`RecordingEventBundleOutboxDispatcher` — captures emitted bundles for assertions.
- The lockstep family grows from 22 to 24 packable packages.