Библиотека для работы с брокером сообщений RabbitMQ.
Реализация 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();
Реализация 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 async Task<string> TestMethod2(string a, string b)
{
logger.LogInformation("TestMethod2 get command with args: a: {a}\tb: {b}", a, b);
return await Task.FromResult(a + b);
}
}
- Методы 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 запускаться не будут).
- Дебаг в зависимости от найденных ошибок / отзывов.