SmartTender.MessageBroker
1.0.13
SmartTender.MessageBroker 1.0.20
Additional DetailsCan not support different R/W connections
See the version list below for details.
dotnet add package SmartTender.MessageBroker --version 1.0.13
NuGet\Install-Package SmartTender.MessageBroker -Version 1.0.13
<PackageReference Include="SmartTender.MessageBroker" Version="1.0.13" />
paket add SmartTender.MessageBroker --version 1.0.13
#r "nuget: SmartTender.MessageBroker, 1.0.13"
// Install SmartTender.MessageBroker as a Cake Addin #addin nuget:?package=SmartTender.MessageBroker&version=1.0.13 // Install SmartTender.MessageBroker as a Cake Tool #tool nuget:?package=SmartTender.MessageBroker&version=1.0.13
SmartMessageBroker NuGet Package
Overview
This NuGet package provides services for working with RabbitMQ message broker within the internal affairs of Smarttender. It offers functionality for message publishing and consuming, allowing efficient communication between different parts of your system via RabbitMQ queues.
Installation
To use this package, you can install it via NuGet Package Manager or directly add it to your project's dependencies in the .csproj
file.
dotnet add package Smarttender.MessageBroker
Usage
Dependency Injection methods in Smarttender.MessageBroker.AspNetCore
package
public static class SmartMessageBrokerServicesDi
{
// Adding required services to the service collection
public static IServiceCollection AddSmartMessageBroker(this IServiceCollection services, string connectionString, Action<BrokerConfig> configureReceivers = null);
// Starting consuming queues
public static IApplicationBuilder UseSmartMessageBrokerConsumers(this IApplicationBuilder app);
}
DI Registration Examples
using SmartMessageBroker;
using Smarttender.MessageBroker.Producer.Consumers;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddSmartMessageBroker("amqps://your-rabbitmq-url",
cfg =>
{
cfg.AddConsumer<NewTenderBidMessageConsumer, NewTenderBidMessage>();
cfg.AddConsumer<FeatureUsingMessageConsumer, FeatureUsingMessage>();
});
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
app.UseSmartMessageBrokerConsumers();
app.MapControllers();
app.Run();
Replace "amqps://your-rabbitmq-url" with your actual RabbitMQ connection string.
Publisher
Service that provides you ability to send message to particular queue
public interface IMessagePublisher
{
void Publish<T>(T message, Queue queue)
where T: BasicMessage;
}
Publisher usage
using Microsoft.AspNetCore.Mvc;
using Smarttender.MessageBroker.Abstracts;
using Smarttender.MessageBroker.Models;
[ApiController]
[Route("api/[controller]")]
public class MessageController : ControllerBase
{
private readonly IMessagePublisher _messagePublisher;
public MessageController(IMessagePublisher messagePublisher)
{
_messagePublisher = messagePublisher ?? throw new ArgumentNullException(nameof(messagePublisher));
}
[HttpPost("string")]
public IActionResult ProduceStringData()
{
try
{
var fakeMessage = new StringDataMessage
{
Data = Faker.Name.FullName(),
Edrpou = Faker.RandomNumber.Next(10000000, 99999999).ToString(),
UserLogin = Faker.Internet.UserName(),
Segment = Faker.Lorem.GetFirstWord(),
FeatureRole = Faker.Lorem.GetFirstWord(),
Datestamp = DateTime.Now,
Tags = new string[] { Faker.Lorem.GetFirstWord(), Faker.Lorem.GetFirstWord() }
};
// Here you can send the mock message using your IMessagePublisher implementation
_messagePublisher.Publish(fakeMessage, Queue.Common);
Console.WriteLine($"Produced mock message: {fakeMessage.Data}");
return Ok();
}
catch (Exception ex)
{
Console.WriteLine($"Error producing mock message: {ex.Message}");
return StatusCode(500, "An error occurred while producing the mock message.");
}
}
[HttpPost]
public IActionResult Produce()
{
try
{
var fakeMessage = new FeatureUsingMessage
{
FeatureName = Faker.Name.FullName(),
Edrpou = Faker.RandomNumber.Next(10000000, 99999999).ToString(),
UserLogin = Faker.Internet.UserName(),
Segment = Faker.Lorem.GetFirstWord(),
FeatureRole = Faker.Lorem.GetFirstWord(),
Datestamp = DateTime.Now,
Tags = new string[] { Faker.Lorem.GetFirstWord(), Faker.Lorem.GetFirstWord() }
};
// Here you can send the mock message using your IMessagePublisher implementation
_messagePublisher.Publish(fakeMessage, Queue.Common);
Console.WriteLine($"Produced mock message: {fakeMessage.FeatureName}");
return Ok();
}
catch (Exception ex)
{
Console.WriteLine($"Error producing mock message: {ex.Message}");
return StatusCode(500, "An error occurred while producing the mock message.");
}
}
}
Consumer
Class that implements basic async consumers:
public abstract class BasicAsyncConsumer<T> : IAsyncMessageConsumer<T>
where T : BasicMessage
{
public virtual string Filter => typeof(T).Name;
public virtual int Ttl => 4 * 60 * 60 * 1000; // базовий час життя 4 години
public abstract Queue Queue { get; }
public abstract Task<MessageDeliveryStatus> OnMessage(T message);
}
and registered in DI like in "DI Registration Examples" blok shown is represents a consumer responsible for processing messages of type <T> synchronously/asynchronously. When a message of this type is received from the RabbitMQ queue, the OnMessage method is invoked.
the message delivery acknowledgment is decided by result of OnMessagge method, that returns MessageDeliveryStatus
public enum MessageDeliveryStatus
{
Acknowledged = 0,
NotAcknowledged = 1,
}
If OnMessagge
returns MessageDeliveryStatus.Acknowledged
that means message will be considered as delivered successfuly otherwise if MessageDeliveryStatus.NotAcknowledged
being returned, that means message is not accepted by consumer end requeued again
Consumer example
public class FeatureUsingMessageConsumer : BasicAsyncConsumer<FeatureUsingMessage>
{
public override Task<MessageDeliveryStatus> OnMessage(FeatureUsingMessage message)
{
// Implement the logic to process the received message
Console.WriteLine($"Received FeatureUsingMessage: {message.FeatureName}");
return Task.FromResult(MessageDeliveryStatus.Acknowledged);
}
}
Target frameworks
net462;
netstandard2.0;
netstandard2.1
Dependencies
- RabbitMQ.Client
Routing Scheme Overview
Consumer Registration
- Queue Declaration: For each consumer in the
consumers
collection, a queue is declared with a name constructed based on_queue
, the executing assembly's name, and the consumer's message type. - Queue Binding: The declared queue is bound to a common exchange (
Exchange.Common
) with a routing key constructed from the consumer's message type and_queue
. - Consumer Creation: An
AsyncEventingBasicConsumer
is created for each consumer, and itsReceived
event is handled. When a message is received on the queue, the consumer'sOnMessage
method is invoked asynchronously.
Message Publication
- Routing Key: When publishing a message, the routing key is constructed from the message's type and the target queue (
queue
). This routing key is used to determine how the message should be routed within RabbitMQ. - Exchange: The message is published to the common exchange (
Exchange.Common
). RabbitMQ uses the exchange to route messages to queues based on routing keys. - Message Body: The message is serialized to JSON and converted to a byte array before being published to the exchange.
Routing Scheme Details
- Exchange: A common exchange (
Exchange.Common
) is used for message routing. - Queues: Each consumer has its own queue declared with a name constructed based on
_queue
, the executing assembly's name, and the consumer's message type. - Routing Keys: Messages are published with routing keys constructed from the message type and the target queue. Consumers bind their queues to the exchange using routing keys based on their filter and
_queue
.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. 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. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6.2
- RabbitMQ.Client (>= 6.8.1)
-
.NETStandard 2.0
- RabbitMQ.Client (>= 6.8.1)
-
.NETStandard 2.1
- RabbitMQ.Client (>= 6.8.1)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on SmartTender.MessageBroker:
Package | Downloads |
---|---|
SmartTender.MessageBroker.AspNetCore
Package Description |
|
SmartTender.MessageBroker.NetFramework
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated | |
---|---|---|---|
1.0.26 | 2,424 | 11/12/2024 | |
1.0.25 | 2,747 | 9/10/2024 | |
1.0.24 | 154 | 9/10/2024 | |
1.0.23 | 241 | 9/9/2024 | |
1.0.22 | 152 | 9/9/2024 | |
1.0.21 | 885 | 8/21/2024 | |
1.0.20 | 9,565 | 8/21/2024 | |
1.0.18 | 174 | 8/14/2024 | |
1.0.17 | 367 | 8/13/2024 | |
1.0.16 | 163 | 8/7/2024 | |
1.0.15 | 157 | 8/7/2024 | |
1.0.14 | 209 | 8/2/2024 | |
1.0.13 | 141 | 8/2/2024 | |
1.0.12 | 931 | 6/19/2024 | |
1.0.11 | 3,752 | 5/27/2024 | |
1.0.10 | 1,540 | 4/29/2024 | |
1.0.9 | 175 | 4/29/2024 | |
1.0.6 | 197 | 4/25/2024 | |
1.0.5 | 189 | 4/25/2024 | |
1.0.4 | 188 | 4/24/2024 | |
1.0.3 | 145 | 4/23/2024 | |
1.0.2 | 153 | 4/23/2024 | |
1.0.1 | 125 | 4/19/2024 | |
1.0.0 | 138 | 4/18/2024 |