Oragon.RabbitMQ.Serializer.NewtonsoftJson 0.0.5-beta

Prefix Reserved
This is a prerelease version of Oragon.RabbitMQ.Serializer.NewtonsoftJson.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package Oragon.RabbitMQ.Serializer.NewtonsoftJson --version 0.0.5-beta                
NuGet\Install-Package Oragon.RabbitMQ.Serializer.NewtonsoftJson -Version 0.0.5-beta                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Oragon.RabbitMQ.Serializer.NewtonsoftJson" Version="0.0.5-beta" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Oragon.RabbitMQ.Serializer.NewtonsoftJson --version 0.0.5-beta                
#r "nuget: Oragon.RabbitMQ.Serializer.NewtonsoftJson, 0.0.5-beta"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Oragon.RabbitMQ.Serializer.NewtonsoftJson as a Cake Addin
#addin nuget:?package=Oragon.RabbitMQ.Serializer.NewtonsoftJson&version=0.0.5-beta&prerelease

// Install Oragon.RabbitMQ.Serializer.NewtonsoftJson as a Cake Tool
#tool nuget:?package=Oragon.RabbitMQ.Serializer.NewtonsoftJson&version=0.0.5-beta&prerelease                

Oragon.RabbitMQ

Quality Gate Status Bugs Code Smells Coverage Duplicated Lines (%) Reliability Rating Security Rating Technical Debt Maintainability Rating Vulnerabilities GitHub last commit

C# .Net Visual Studio

Jenkins

Telegram 🇧🇷

Opinionated and Simplified Minimal APIs for Consuming Messages from RabbitMQ, Ensuring No Crucial Configurations Are Hidden.

What is Oragon.RabbitMQ?

Oragon.RabbitMQ provides everything you need to create resilient RabbitMQ consumers without the need to study numerous books and articles or introduce unknown risks to your environment.

If you have a service like this

public class BusinessService
{
    public async Task DoSomethingAsync(BusinessCommandOrEvent commandOrEvent)
    {
        ... business core ...
    }
}

You will create a RabbitMQ Consumers with this

Singleton
builder.Services.AddSingleton<BusinessService>();

builder.Services.AddSingleton<IAMQPSerializer, SystemTextJsonAMQPSerializer>();

builder.Services.MapQueue<BusinessService, BusinessCommandOrEvent>(config => config
    .WithDispatchInRootScope()    
    .WithAdapter((svc, msg) => svc.DoSomethingAsync(msg))
    .WithQueueName("events")
    .WithPrefetchCount(1)
);

Scoped
builder.Services.AddScoped<BusinessService>();

builder.Services.AddSingleton<IAMQPSerializer, SystemTextJsonAMQPSerializer>();

builder.Services.MapQueue<BusinessService, BusinessCommandOrEvent>(config => config
    .WithDispatchInChildScope()    
    .WithAdapter((svc, msg) => svc.DoSomethingAsync(msg))
    .WithQueueName("events")
    .WithPrefetchCount(1)
);

Scoped and Keyed Services, Same Type, Multiple Consumers, Using NewtonsoftAMQPSerializer
builder.Services.AddKeyedScoped<BusinessService>("key-of-service-1");
builder.Services.AddKeyedScoped("key-of-service-2", (sp, key) => new BusinessService(... custom dependencies ...));

builder.Services.AddSingleton<IAMQPSerializer, NewtonsoftAMQPSerializer>();

builder.Services.MapQueue<BusinessService, BusinessCommandOrEvent>(config => config
    .WithDispatchInChildScope()
    .WithKeyedService("key-of-service-1") 
    .WithAdapter((svc, msg) => svc.DoSomethingAsync(msg))
    .WithQueueName("events1")
    .WithPrefetchCount(1)
);

builder.Services.MapQueue<BusinessService, BusinessCommandOrEvent>(config => config
    .WithDispatchInChildScope()
    .WithKeyedService("key-of-service-2") 
    .WithAdapter((svc, msg) => svc.DoSomethingAsync(msg))
    .WithQueueName("events2")
    .WithPrefetchCount(1)
);

Concepts

Decoupling Business Logic from Infrastructure

This approach is designed to decouple RabbitMQ consumers from business logic, ensuring that business code remains unaware of the queue consumption context.

The result is incredibly simple, decoupled, agnostic, more reusable, and highly testable code.

Opinionated Design: Why?

This consumer is focused on creating a resilient consumer using manual acknowledgments.

  • The flow produces a BasicReject without requeue for serialization failures (e.g., incorrectly formatted messages), you will use dead-lettering to ensure these messages are not lost.
  • The flow produces a BasicNack with requeue for processing failures, allowing for message reprocessing.
  • Minimal API design style made without reflection
  • Extensible with support for custom serializers and encoders

RabbitMQ Tracing com OpenTelemetry

Full support for OpenTelemetry on publishing or consuming RabbitMQ messages.

<img src="./docs/playground.gif">

Refactored to use RabbitMQ.Client 7x (with IChannel instead IModel)

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
0.0.9-beta 62 10/19/2024
0.0.8-beta 40 8/2/2024
0.0.7-beta 62 6/22/2024
0.0.6-beta 61 6/6/2024
0.0.5-beta 53 6/5/2024