Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions src/All.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -362,14 +362,6 @@
<Project Path="Mocha/src/Mocha.Utilities/Mocha.Utilities.csproj" />
<Project Path="Mocha/src/Mocha/Mocha.csproj" />
</Folder>
<Folder Name="/Mocha/src/Demo/">
<Project Path="Mocha/src/Demo/Demo.AppHost/Demo.AppHost.csproj" />
<Project Path="Mocha/src/Demo/Demo.Billing/Demo.Billing.csproj" />
<Project Path="Mocha/src/Demo/Demo.Catalog/Demo.Catalog.csproj" />
<Project Path="Mocha/src/Demo/Demo.Contracts/Demo.Contracts.csproj" />
<Project Path="Mocha/src/Demo/Demo.ServiceDefaults/Demo.ServiceDefaults.csproj" />
<Project Path="Mocha/src/Demo/Demo.Shipping/Demo.Shipping.csproj" />
</Folder>
<Folder Name="/Mocha/test/">
<Project Path="Mocha/test/Demo.Catalog.Tests/Demo.Catalog.Tests.csproj" />
<Project Path="Mocha/test/Mocha.Analyzers.Tests/Mocha.Analyzers.Tests.csproj" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,36 @@
var builder = DistributedApplication.CreateBuilder(args);
// Infrastructure
var rabbitmq = builder.AddRabbitMQ("rabbitmq").WithManagementPlugin();
var db = builder.AddPostgres("postgres").WithPgWeb();
var catalogDb = db.AddDatabase("catalog-db");
var billingDb = db.AddDatabase("billing-db");
var shippingDb = db.AddDatabase("shipping-db");
// Services
builder
.AddProject<Projects.Demo_Catalog>("catalog")
.WithReference(rabbitmq)
.WithReference(catalogDb)
.WaitFor(rabbitmq)
.WaitFor(catalogDb);
builder
.AddProject<Projects.Demo_Billing>("billing")
.WithReference(rabbitmq)
.WithReference(billingDb)
.WaitFor(rabbitmq)
.WaitFor(billingDb);
builder
.AddProject<Projects.Demo_Shipping>("shipping")
.WithReference(rabbitmq)
.WithReference(shippingDb)
.WaitFor(rabbitmq)
.WaitFor(shippingDb);
builder.Build().Run();
var builder = DistributedApplication.CreateBuilder(args);

// Infrastructure
var rabbitmq = builder.AddRabbitMQ("rabbitmq").WithManagementPlugin();

var db = builder.AddPostgres("postgres").WithPgWeb();

var catalogDb = db.AddDatabase("catalog-db");

var billingDb = db.AddDatabase("billing-db");

var shippingDb = db.AddDatabase("shipping-db");

// Services
builder
.AddProject<Projects.Demo_Catalog>("catalog")
.WithReference(rabbitmq)
.WithReference(catalogDb)
.WaitFor(rabbitmq)
.WaitFor(catalogDb);

builder
.AddProject<Projects.Demo_Billing>("billing")
.WithReference(rabbitmq)
.WithReference(billingDb)
.WaitFor(rabbitmq)
.WaitFor(billingDb);

builder
.AddProject<Projects.Demo_Shipping>("shipping")
.WithReference(rabbitmq)
.WithReference(shippingDb)
.WaitFor(rabbitmq)
.WaitFor(shippingDb);

builder.Build().Run();
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public async ValueTask<ProcessPaymentResult> HandleAsync(
{
var invoice = await db.Invoices.FirstOrDefaultAsync(
i => i.Id == command.InvoiceId, cancellationToken);

if (invoice is null)
{
return new ProcessPaymentResult(false, Error: "Invoice not found");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
<ItemGroup>
<ProjectReference Include="..\Demo.ServiceDefaults\Demo.ServiceDefaults.csproj" />
<ProjectReference Include="..\Demo.Contracts\Demo.Contracts.csproj" />
<ProjectReference Include="..\..\Mocha\Mocha.csproj" />
<ProjectReference Include="..\..\Mocha.Mediator\Mocha.Mediator.csproj" />
<ProjectReference Include="..\..\Mocha.Analyzers\Mocha.Analyzers.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<ProjectReference Include="..\..\Mocha.EntityFrameworkCore.Postgres\Mocha.EntityFrameworkCore.Postgres.csproj" />
<ProjectReference Include="..\..\Mocha.Transport.RabbitMQ\Mocha.Transport.RabbitMQ.csproj" />
<ProjectReference Include="..\..\..\src\Mocha\Mocha.csproj" />
<ProjectReference Include="..\..\..\src\Mocha.Mediator\Mocha.Mediator.csproj" />
<ProjectReference Include="..\..\..\src\Mocha.Analyzers\Mocha.Analyzers.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<ProjectReference Include="..\..\..\src\Mocha.EntityFrameworkCore.Postgres\Mocha.EntityFrameworkCore.Postgres.csproj" />
<ProjectReference Include="..\..\..\src\Mocha.Transport.RabbitMQ\Mocha.Transport.RabbitMQ.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Aspire.Npgsql.EntityFrameworkCore.PostgreSQL" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public async ValueTask<InitiateReturnResult> HandleAsync(
{
var order = await db.Orders.Include(o => o.Product)
.FirstOrDefaultAsync(o => o.Id == command.OrderId, cancellationToken);

if (order is null)
{
return new InitiateReturnResult(false, Error: "Order not found");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Mocha.Transport.InMemory\Mocha.Transport.InMemory.csproj" />
<ProjectReference Include="..\..\..\src\Mocha.Transport.InMemory\Mocha.Transport.InMemory.csproj" />
<ProjectReference Include="..\Demo.ServiceDefaults\Demo.ServiceDefaults.csproj" />
<ProjectReference Include="..\Demo.Contracts\Demo.Contracts.csproj" />
<ProjectReference Include="..\..\Mocha\Mocha.csproj" />
<ProjectReference Include="..\..\Mocha.Mediator\Mocha.Mediator.csproj" />
<ProjectReference Include="..\..\Mocha.Analyzers\Mocha.Analyzers.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<ProjectReference Include="..\..\Mocha.EntityFrameworkCore.Postgres\Mocha.EntityFrameworkCore.Postgres.csproj" />
<ProjectReference Include="..\..\Mocha.Hosting\Mocha.Hosting.csproj" />
<ProjectReference Include="..\..\Mocha.Transport.RabbitMQ\Mocha.Transport.RabbitMQ.csproj" />
<ProjectReference Include="..\..\..\src\Mocha\Mocha.csproj" />
<ProjectReference Include="..\..\..\src\Mocha.Mediator\Mocha.Mediator.csproj" />
<ProjectReference Include="..\..\..\src\Mocha.Analyzers\Mocha.Analyzers.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<ProjectReference Include="..\..\..\src\Mocha.EntityFrameworkCore.Postgres\Mocha.EntityFrameworkCore.Postgres.csproj" />
<ProjectReference Include="..\..\..\src\Mocha.Hosting\Mocha.Hosting.csproj" />
<ProjectReference Include="..\..\..\src\Mocha.Transport.RabbitMQ\Mocha.Transport.RabbitMQ.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Aspire.Npgsql.EntityFrameworkCore.PostgreSQL" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
<RootNamespace>HotChocolate.Demo.Contracts</RootNamespace>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Mocha\Mocha.csproj" />
<ProjectReference Include="..\..\..\src\Mocha\Mocha.csproj" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AssemblyName>HotChocolate.Demo.ServiceDefaults</AssemblyName>
<RootNamespace>HotChocolate.Demo.ServiceDefaults</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireSharedProject>true</IsAspireSharedProject>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Http.Resilience" />
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
</ItemGroup>
</Project>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AssemblyName>HotChocolate.Demo.ServiceDefaults</AssemblyName>
<RootNamespace>HotChocolate.Demo.ServiceDefaults</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireSharedProject>true</IsAspireSharedProject>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Http.Resilience" />
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
<ItemGroup>
<ProjectReference Include="..\Demo.ServiceDefaults\Demo.ServiceDefaults.csproj" />
<ProjectReference Include="..\Demo.Contracts\Demo.Contracts.csproj" />
<ProjectReference Include="..\..\Mocha\Mocha.csproj" />
<ProjectReference Include="..\..\Mocha.Mediator\Mocha.Mediator.csproj" />
<ProjectReference Include="..\..\Mocha.Analyzers\Mocha.Analyzers.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<ProjectReference Include="..\..\Mocha.EntityFrameworkCore.Postgres\Mocha.EntityFrameworkCore.Postgres.csproj" />
<ProjectReference Include="..\..\Mocha.Transport.RabbitMQ\Mocha.Transport.RabbitMQ.csproj" />
<ProjectReference Include="..\..\..\src\Mocha\Mocha.csproj" />
<ProjectReference Include="..\..\..\src\Mocha.Mediator\Mocha.Mediator.csproj" />
<ProjectReference Include="..\..\..\src\Mocha.Analyzers\Mocha.Analyzers.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<ProjectReference Include="..\..\..\src\Mocha.EntityFrameworkCore.Postgres\Mocha.EntityFrameworkCore.Postgres.csproj" />
<ProjectReference Include="..\..\..\src\Mocha.Transport.RabbitMQ\Mocha.Transport.RabbitMQ.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Aspire.Npgsql.EntityFrameworkCore.PostgreSQL" />
Expand Down
File renamed without changes.
7 changes: 7 additions & 0 deletions src/Mocha/examples/Demo/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<Project>
<PropertyGroup>
<IsPackable>false</IsPackable>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# Demo Scripts
# Demo

In ./http you will find .http files that you can use with the VS Code REST Client extension to interact with the e-commerce demo services. These scripts demonstrate typical order flows, including placing orders, processing payments, and handling returns. Each file contains a series of requests that you can execute step-by-step to see how the different services interact through events and commands.

HTTP files for [VS Code REST Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) to interact with the e-commerce demo services.

Expand Down
2 changes: 1 addition & 1 deletion website/src/docs/mocha/v1/handlers-and-consumers.md
Original file line number Diff line number Diff line change
Expand Up @@ -518,4 +518,4 @@ Your handlers are registered. Learn how the source generator discovers and regis

> **Runnable examples:** [BatchHandler](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Examples/HandlersAndConsumers/BatchHandler), [LowLevelConsumer](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Examples/HandlersAndConsumers/LowLevelConsumer), [CustomConsumer](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Examples/HandlersAndConsumers/CustomConsumer)
>
> **Full demo:** [Demo.Billing](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo/Demo.Billing) shows event handlers (`OrderPlacedEventHandler`), batch handlers (`OrderPlacedBatchHandler` with revenue aggregation, `BulkOrderBatchHandler` for high-volume processing), and request handlers (`ProcessRefundCommandHandler`).
> **Full demo:** [Demo.Billing](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo/Demo.Billing) shows event handlers (`OrderPlacedEventHandler`), batch handlers (`OrderPlacedBatchHandler` with revenue aggregation, `BulkOrderBatchHandler` for high-volume processing), and request handlers (`ProcessRefundCommandHandler`).
2 changes: 1 addition & 1 deletion website/src/docs/mocha/v1/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,6 @@ Choose an entry point based on how you learn best:
- **Evaluating Mocha for a specific broker:** [Transports](/docs/mocha/v1/transports) - understand the transport abstraction and what is available.
- **In-process CQRS:** [Mediator](/docs/mocha/v1/mediator) - dispatch commands, queries, and notifications within a single service using the source-generated mediator.

- **See a real-world system:** The [Demo application](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo) is a complete e-commerce system with three services (Catalog, Billing, Shipping) that demonstrates event-driven communication, sagas, batch processing, the transactional outbox, and .NET Aspire orchestration.
- **See a real-world system:** The [Demo application](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo) is a complete e-commerce system with three services (Catalog, Billing, Shipping) that demonstrates event-driven communication, sagas, batch processing, the transactional outbox, and .NET Aspire orchestration.

Ready to build? Start with the [Quick Start](/docs/mocha/v1/quick-start).
Original file line number Diff line number Diff line change
Expand Up @@ -588,7 +588,7 @@ In `Sequential` mode (the default), the first handler exception stops execution

When using `NotificationPublishMode.Concurrent`, all handler pipelines execute in parallel but share the same scoped `IServiceProvider`. Scoped services like `DbContext` are not thread-safe. You will see race conditions or `ObjectDisposedException` if multiple handlers access the same scoped service concurrently. Switch to `Sequential` mode or create a new `IServiceScope` inside handlers that need their own scoped services.

> **Full demo:** The [Demo application](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo) uses `UseEntityFrameworkTransactions` and `AddInstrumentation` alongside the mediator and message bus in a complete e-commerce system.
> **Full demo:** The [Demo application](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo) uses `UseEntityFrameworkTransactions` and `AddInstrumentation` alongside the mediator and message bus in a complete e-commerce system.

# Next steps

Expand Down
2 changes: 1 addition & 1 deletion website/src/docs/mocha/v1/messages.md
Original file line number Diff line number Diff line change
Expand Up @@ -204,4 +204,4 @@ Now that you understand message structure, learn the three messaging patterns.

- [**Messaging Patterns**](/docs/mocha/v1/messaging-patterns) - Pub/sub events, point-to-point commands, and request/reply.

> **Full demo:** [Demo.Contracts](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo/Demo.Contracts) contains a complete set of message contracts for an e-commerce system - events (`OrderPlacedEvent`, `PaymentCompletedEvent`), send messages (`ProcessRefundCommand`, `ReserveInventoryCommand`), and request/reply pairs used by sagas.
> **Full demo:** [Demo.Contracts](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo/Demo.Contracts) contains a complete set of message contracts for an e-commerce system - events (`OrderPlacedEvent`, `PaymentCompletedEvent`), send messages (`ProcessRefundCommand`, `ReserveInventoryCommand`), and request/reply pairs used by sagas.
2 changes: 1 addition & 1 deletion website/src/docs/mocha/v1/messaging-patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,6 @@ If your request record does not implement `IEventRequest<TResponse>`, you cannot

> **Runnable examples:** [EventPubSub](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Examples/MessagingPatterns/EventPubSub), [SendFireAndForget](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Examples/MessagingPatterns/SendFireAndForget), [RequestReply](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Examples/MessagingPatterns/RequestReply)
>
> **Full demo:** The [Demo application](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo) uses all three patterns: [Demo.Catalog](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo/Demo.Catalog) publishes `OrderPlacedEvent` (pub/sub), [Demo.Billing](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo/Demo.Billing) handles `ProcessRefundCommand` (send), and sagas use `RequestAsync` for request/reply coordination.
> **Full demo:** The [Demo application](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo) uses all three patterns: [Demo.Catalog](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo/Demo.Catalog) publishes `OrderPlacedEvent` (pub/sub), [Demo.Billing](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo/Demo.Billing) handles `ProcessRefundCommand` (send), and sagas use `RequestAsync` for request/reply coordination.

Ready to implement these patterns? See [Handlers and Consumers](/docs/mocha/v1/handlers-and-consumers).
2 changes: 1 addition & 1 deletion website/src/docs/mocha/v1/observability.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,4 +205,4 @@ For more detail on .NET distributed tracing concepts and how `Activity` maps to

> **Runnable example:** [OpenTelemetry](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Examples/Observability/OpenTelemetry)
>
> **Full demo:** [Demo.ServiceDefaults](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo/Demo.ServiceDefaults) shows how to configure OpenTelemetry tracing and metrics for all services in a shared project, including the `"Mocha"` activity source. The [Demo.AppHost](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo/Demo.AppHost) orchestrates everything with .NET Aspire for end-to-end observability.
> **Full demo:** [Demo.ServiceDefaults](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo/Demo.ServiceDefaults) shows how to configure OpenTelemetry tracing and metrics for all services in a shared project, including the `"Mocha"` activity source. The [Demo.AppHost](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo/Demo.AppHost) orchestrates everything with .NET Aspire for end-to-end observability.
2 changes: 1 addition & 1 deletion website/src/docs/mocha/v1/quick-start.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,4 +159,4 @@ Now that you have a working app, learn how messages work in [Messages](/docs/moc

> **Runnable example:** [Examples/QuickStart](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Examples/QuickStart)
>
> **Full demo:** The [Demo application](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo) shows a complete e-commerce system with Catalog, Billing, and Shipping services communicating through Mocha and orchestrated with .NET Aspire.
> **Full demo:** The [Demo application](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo) shows a complete e-commerce system with Catalog, Billing, and Shipping services communicating through Mocha and orchestrated with .NET Aspire.
2 changes: 1 addition & 1 deletion website/src/docs/mocha/v1/reliability.md
Original file line number Diff line number Diff line change
Expand Up @@ -983,4 +983,4 @@ Your messaging pipeline now handles exceptions per-type with retry and redeliver

> **Runnable examples:** [OutboxInbox](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Examples/Reliability/OutboxInbox), [CircuitBreaker](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Examples/Reliability/CircuitBreaker)
>
> **Full demo:** All three Demo services ([Catalog](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo/Demo.Catalog), [Billing](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo/Demo.Billing), [Shipping](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/src/Demo/Demo.Shipping)) use the PostgreSQL transactional outbox and inbox with `UseTransaction()` and `UseResilience()` for reliable, exactly-once message processing.
> **Full demo:** All three Demo services ([Catalog](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo/Demo.Catalog), [Billing](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo/Demo.Billing), [Shipping](https://github.com/ChilliCream/graphql-platform/tree/main/src/Mocha/examples/Demo/Demo.Shipping)) use the PostgreSQL transactional outbox and inbox with `UseTransaction()` and `UseResilience()` for reliable, exactly-once message processing.
Loading
Loading