Библиотека для работы с брокером сообщений RabbitMQ.
Реализация publisher-a для работы с брокером сообщений RabbitMQ.
Через клиент, в зависимости от конфигурации, возможна отправка сообщений и "RPC" запросов.
Для отправки сообщений используется метод SendMessageAsync.
Для отправки "RPC" запросов используется метод SendRequestAsync.
Аналогичен RabbitMQControllerBase
, только внутри себя содержит "сервер", принимающий сообщения из брокера.
Пример использования:
private static RabbitMQConfigurationBuilder? configBuilder;
public static void Main(string[] args)
{
configBuilder = new();
configBuilder.AddConnectionFactory(new()
{
HostName = "Kuznetsovy-Server",
UserName = "ebcey1",
Password = "123"
});
configBuilder.AddQueueConfiguration(new("ExampleQueue", autoDelete: true));
Logger logger = LogManager.Setup().LoadConfigurationFromFile("nlog.config").GetCurrentClassLogger();
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddSmartRabbitMQController<TestController>(configBuilder.Build());
})
.UseNLog()
.ConfigureLogging(log =>
{
log.ClearProviders();
log.AddNLog("nlog.config");
})
.Build();
host.Run();
}
internal class TestController : RabbitMQSmartControllerBase
{
private readonly ILogger<TestController> logger;
public TestController(ILogger<TestController> logger)
{
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
[RabbitMQMethod("ExampleMethod")]
public Task<string> TestMethod2(string a, string b)
{
logger.LogInformation("TestMethod2 get command with args: a: {a}\tb: {b}", a, b);
return Task.FromResult(a + b);
}
}
Реализация consumer-a как IHostedService.
Стоит отметить что в данном случае consumer всегда будет асинхронный.
Попытка реализации сервиса consumer-a через контроллеры (а-ля ControllerBase для http).
Методы контроллера должны быть асинхронными.
configBuilder = new();
configBuilder.AddConnectionFactory(new()
{
HostName = "Kuznetsovy-Server",
UserName = "ebcey1",
Password = "123"
});
configBuilder.AddQueueConfiguration(new("ExampleQueue", autoDelete: true));
RabbitMQConfiguration config = configBuilder.Build();
IHost host = Host.CreateDefaultBuilder(args)
.UseNLog()
.ConfigureLogging(log =>
{
log.AddNLog("nlog.config");
})
.ConfigureServices(services =>
{
services.AddRabbitMQController<ExampleController>();
services.AddRabbitMQMappedServer(config);
})
.Build();
host.Run();
- Передача заголовка о наличии компрессии в сообщениях от клиента
- Автоматическое определение наличия компрессии сообщения на уровне контроллера при приеме сообщения
- Добавлена возможность настройки GZip компрессии/декомпрессии отправляемых сообщений.
- В
CallbackRabbitMQConfiguration
добавлена конфигурация ожидания ответа на запрос. - Для
RabbitMQClient
добавлены новые конструкторы, а старые УДАЛЕНЫ. AddRabbitMQClient
дляIServiceCollection
УБРАНА старая реализация с указанием таймаута через параметр. Таймаут теперь указывается вCallbackRabbitMQConfiguration
.- Добавлены описания для публичных методов.
- Исправлена ошибка, когда
RabbitMQSmartController
не обрабатывал сообщения в выбранной кодировке, а только в UTF-8. - Добавлена возможность добавлять в
IServiceColletion
свою реализациюRabbitMQClient
- Добавлена возможность добавлять в
IServiceColletion
свою реализациюRabbitMQServer
- Исправлена передача исключений.
- Добавлена конфигурация старта сервисов.
- Добавлена опция для клиента, не выбрасывать серверные исключения из ответа на запрос.
- Логи отправки и приема сообщений переведены на уровень Trace.
- Добавлена конфигурация QoS [опционально] при старте клиента и сервера.
- Добавлен вариант передачи исключений. Для этого следует использовать
RabbitMQRequestProcessingException
внутри метода контроллера. Если клиент получит ответ с подобным исключением, то выкинет его в методеSendRequestAsync
. - В конфигурацию
RabbitMQConfiguration
добавлена возможность передачи кодировки. По умолчанию используется UTF-8.
Фичи:
- Библиотека переведена на 8-ой дотнет.
- Обновлены используемые пакеты.
- Инициализация подключения, создание канала и консумера вынесены в старт сервиса
IHostedService.StartAsync(CancellationToken cancellationToken)
. - Добавлены поддерживаемые типы обменников как enum-ы (опционально, можно передавать по старому как строку).
- В конфигурацию добавлены параметры установки канала.
- В репозиторий добавлены примеры использования в докере. Через сервис ExampleDockerClient можно отправить сообщения и запросы на сервис ExampleDockerServer.
- При создании
RabbitMQSmartController
теперь берется не первый конструктор, а первый подходящий по сервисам вIServiceProvider
. Если ни один конструктор не подошел, то пытаемся создать безе парамметров. - Добавлена поддержка topic обменников.
- Консумеры AutoAck.
- Добавлена конфигурация для callback обменника и очереди.
Фиксы:
- Исправлена ошибка, когда очередь не привязывалась к обменнику.
- Методы SendMessage и SendRequest у RabbitMQClient-a сделаны вирутальными чтобы их можно было замокать.
- Инициализация подключения к RabbitMQ теперь будет происходить на стадии запуска сервиса.
- Добавлен новый тип контроллера
RabbitMQSmartController
. Данный контроллер содержит в себе сервер, принимающий сообщения из брокера сообщений и вызывающий методы, указанные внутри сообщения.
- Так как использование Microsoft.Text.Json вызывало ошибки в работе контроллера - было принято решение перейти на Newtownsoft.Json.
- В случае если возникли ошибки во время обработки сообщения/запроса, сообщение будет приниматься.
- Исправлена ошибка, когда, при атрибутах метода string, некорректно парсились параметры запроса в контроллере.
- Добавил простые конструкторы для конфигурации.
- В ServiceCollectionExtensions добавлен метод для добавления RabbitMQClient-a.
- Переделаны контроллеры. Теперь они scoped.
- Убран метод FixRabbitMQControllers для IServiceCollection
- Исправлена ошибка, когда при использовании метода AddRabbitMQController, MappedServer мог не видеть контроллеры.
Фичи:
- Добавил проекты с примерами работы клиента и сервера;
- Добавил базовый интерфейс для контроллера;
- Добавил методы расширения IServiceCollection, через который идет настройка сервера и контроллеров;
- RabbitMQMappedServer теперь не требует сервиса самого сервера, а инициирует его сам.
- Убрал кучу лишних конструкторов;
- Добавил дебаг логирование в сервисы;
Фиксы:
- Исправлена ошибка, когда таймаут ожидания ответа на запрос учитывался в миллисекундах.
- Исправлена ошибка, когда не стартовал ресивер, если в настройках не указать, что он асинхронный;
- Исправил ошибку, когда при отправке ответа на запрос, MappedServer выдавал исключение.
- Изменил алгоритм работы при остановке сервиса. Теперь только закрывает соединение.
- Добавил реализацию клиента (EBCEYS.RabbitMQ.Client). Через него возможна отправка сообщений и запросов на контроллеры.
- Переименовал атрибут для методов RabbitMQ (RabbitMQMethodName -> RabbitMQMethod).
- Исправил недоработку когда для парсинга сообщения в ресивере не использовались SerializerOptions.
- Добавил тесты для тестирования в своей среде (во время CI/CD запускаться не будут).
- Дебаг в зависимости от найденных ошибок / отзывов.
- Добавить Stream обмен.