{"id":24649062,"url":"https://github.com/ebceys/ebceys.rabbitmq","last_synced_at":"2025-05-13T11:06:24.902Z","repository":{"id":75360733,"uuid":"605251859","full_name":"EBCEYS/EBCEYS.RabbitMQ","owner":"EBCEYS","description":"Библиотека для работы с брокером сообщений RabbitMQ","archived":false,"fork":false,"pushed_at":"2025-03-11T09:08:15.000Z","size":160,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-13T11:06:13.533Z","etag":null,"topics":["csharp","csharp-lib","csharp-library","dotnet","dotnet-core","dotnetcore","nuget-package","rabbitmq","rabbitmq-client","rabbitmq-consumer","rabbitmq-producer","rabbitmq-server"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EBCEYS.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-02-22T19:14:09.000Z","updated_at":"2025-03-11T09:04:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"6e026c9b-251e-4459-8433-e1d5b4c77a23","html_url":"https://github.com/EBCEYS/EBCEYS.RabbitMQ","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EBCEYS%2FEBCEYS.RabbitMQ","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EBCEYS%2FEBCEYS.RabbitMQ/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EBCEYS%2FEBCEYS.RabbitMQ/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EBCEYS%2FEBCEYS.RabbitMQ/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EBCEYS","download_url":"https://codeload.github.com/EBCEYS/EBCEYS.RabbitMQ/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253929362,"owners_count":21985802,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","csharp-lib","csharp-library","dotnet","dotnet-core","dotnetcore","nuget-package","rabbitmq","rabbitmq-client","rabbitmq-consumer","rabbitmq-producer","rabbitmq-server"],"created_at":"2025-01-25T17:15:36.745Z","updated_at":"2025-05-13T11:06:24.853Z","avatar_url":"https://github.com/EBCEYS.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# EBCEYS.RabbitMQ\n\n[![.NET](https://github.com/EBCEYS/EBCEYS.RabbitMQ/actions/workflows/dotnet.yml/badge.svg)](https://github.com/EBCEYS/EBCEYS.RabbitMQ/actions/workflows/dotnet.yml)\n\n## Описание\n\nБиблиотека для работы с брокером сообщений RabbitMQ.\n\n### EBCEYS.RabbitMQ.Client\nРеализация publisher-a для работы с брокером сообщений RabbitMQ.\n\nЧерез клиент, в зависимости от конфигурации, возможна отправка сообщений и \"RPC\" запросов.\n\nДля отправки сообщений используется метод SendMessageAsync.\n\nДля отправки \"RPC\" запросов используется метод SendRequestAsync.\n\n### EBCEYS.RabbitMQ.Server.MappedService.SmartController\n\nАналогичен `RabbitMQControllerBase`, только внутри себя содержит \"сервер\", принимающий сообщения из брокера.\n\nПример использования:\n```cs\nprivate static RabbitMQConfigurationBuilder? configBuilder;\npublic static void Main(string[] args)\n{\n    configBuilder = new();\n    configBuilder.AddConnectionFactory(new()\n    {\n        HostName = \"Kuznetsovy-Server\",\n        UserName = \"ebcey1\",\n        Password = \"123\"\n    });\n    configBuilder.AddQueueConfiguration(new(\"ExampleQueue\", autoDelete: true));\n\n    Logger logger = LogManager.Setup().LoadConfigurationFromFile(\"nlog.config\").GetCurrentClassLogger();\n\n    IHost host = Host.CreateDefaultBuilder(args)\n        .ConfigureServices(services =\u003e\n        {\n            services.AddSmartRabbitMQController\u003cTestController\u003e(configBuilder.Build());\n        })\n        .UseNLog()\n        .ConfigureLogging(log =\u003e\n        {\n            log.ClearProviders();\n            log.AddNLog(\"nlog.config\");\n        })\n        .Build();\n\n    host.Run();\n}\n\ninternal class TestController : RabbitMQSmartControllerBase\n{\n    private readonly ILogger\u003cTestController\u003e logger;\n\n    public TestController(ILogger\u003cTestController\u003e logger)\n    {\n        this.logger = logger ?? throw new ArgumentNullException(nameof(logger));\n    }\n    [RabbitMQMethod(\"ExampleMethod\")]\n    public Task\u003cstring\u003e TestMethod2(string a, string b)\n    {\n        logger.LogInformation(\"TestMethod2 get command with args: a: {a}\\tb: {b}\", a, b);\n        return Task.FromResult(a + b);\n    }\n}\n```\n\n### EBCEYS.RabbitMQ.Server.MappedService.RabbitMQServer\n\nРеализация consumer-a как IHostedService.\n\nСтоит отметить что в данном случае consumer всегда будет асинхронный.\n\n### EBCEYS.RabbitMQ.Server.MappedService.RabbitMQMappedServer ***!!! УСТАРЕЛО !!!***\n\nПопытка реализации сервиса consumer-a через контроллеры (а-ля ControllerBase для http).\n\nМетоды контроллера должны быть асинхронными.\n\n#### Пример конфигурации:\n```cs\nconfigBuilder = new();\nconfigBuilder.AddConnectionFactory(new()\n{\n    HostName = \"Kuznetsovy-Server\",\n    UserName = \"ebcey1\",\n    Password = \"123\"\n});\nconfigBuilder.AddQueueConfiguration(new(\"ExampleQueue\", autoDelete: true));\nRabbitMQConfiguration config = configBuilder.Build();\nIHost host = Host.CreateDefaultBuilder(args)\n    .UseNLog()\n    .ConfigureLogging(log =\u003e\n    {\n        log.AddNLog(\"nlog.config\");\n    })\n    .ConfigureServices(services =\u003e\n    {\n        services.AddRabbitMQController\u003cExampleController\u003e();\n\n        services.AddRabbitMQMappedServer(config);\n    })\n    .Build();\nhost.Run();\n```\n\n## Изменения\n### v1.5.1\n1. Передача заголовка о наличии компрессии в сообщениях от клиента\n1. Автоматическое определение наличия компрессии сообщения на уровне контроллера при приеме сообщения\n### v1.5.0\n1. Добавлена возможность настройки GZip компрессии/декомпрессии отправляемых сообщений.\n1. В `CallbackRabbitMQConfiguration` добавлена конфигурация ожидания ответа на запрос.\n1. Для `RabbitMQClient` добавлены новые конструкторы, а старые ***УДАЛЕНЫ***.\n1. `AddRabbitMQClient` для `IServiceCollection` ***УБРАНА*** старая реализация с указанием таймаута через параметр. Таймаут теперь указывается в `CallbackRabbitMQConfiguration`.\n1. Добавлены описания для публичных методов.\n1. Исправлена ошибка, когда `RabbitMQSmartController` не обрабатывал сообщения в выбранной кодировке, а только в UTF-8.\n1. Добавлена возможность добавлять в `IServiceColletion` свою реализацию `RabbitMQClient`\n1. Добавлена возможность добавлять в `IServiceColletion` свою реализацию `RabbitMQServer`\n### v1.4.2\n1. Исправлена передача исключений.\n1. Добавлена конфигурация старта сервисов.\n1. Добавлена опция для клиента, не выбрасывать серверные исключения из ответа на запрос.\n1. Логи отправки и приема сообщений переведены на уровень *Trace*.\n### v1.4.1\n1. Добавлена конфигурация QoS [опционально] при старте клиента и сервера.\n1. Добавлен вариант передачи исключений. Для этого следует использовать `RabbitMQRequestProcessingException` внутри метода контроллера. Если клиент получит ответ с подобным исключением, то выкинет его в методе `SendRequestAsync`.\n1. В конфигурацию `RabbitMQConfiguration` добавлена возможность передачи кодировки. По умолчанию используется UTF-8.\n### v1.4.0\nФичи:\n1. Библиотека переведена на 8-ой дотнет.\n2. Обновлены используемые пакеты.\n3. Инициализация подключения, создание канала и консумера вынесены в старт сервиса `IHostedService.StartAsync(CancellationToken cancellationToken)`.\n4. Добавлены поддерживаемые типы обменников как enum-ы (опционально, можно передавать по старому как строку).\n5. В конфигурацию добавлены параметры установки канала.\n6. В репозиторий добавлены примеры использования в докере. Через сервис ExampleDockerClient можно отправить сообщения и запросы на сервис ExampleDockerServer.\n7. При создании `RabbitMQSmartController` теперь берется не первый конструктор, а первый подходящий по сервисам в `IServiceProvider`. Если ни один конструктор не подошел, то пытаемся создать безе парамметров.\n8. Добавлена поддержка topic обменников.\n9. Консумеры AutoAck.\n10. Добавлена конфигурация для callback обменника и очереди.\n\nФиксы:\n1. Исправлена ошибка, когда очередь не привязывалась к обменнику.\n### v1.3.1\n1. Методы SendMessage и SendRequest у RabbitMQClient-a сделаны вирутальными чтобы их можно было замокать.\n2. Инициализация подключения к RabbitMQ теперь будет происходить на стадии запуска сервиса.\n### v1.3.0\n1. Добавлен новый тип контроллера `RabbitMQSmartController`.\nДанный контроллер содержит в себе сервер, принимающий сообщения из брокера сообщений и вызывающий методы, указанные внутри сообщения.\n### v1.2.0\n1. Так как использование Microsoft.Text.Json вызывало ошибки в работе контроллера - было принято решение перейти на Newtownsoft.Json.\n2. В случае если возникли ошибки во время обработки сообщения/запроса, сообщение будет приниматься.\n### v1.1.6\n1. Исправлена ошибка, когда, при атрибутах метода string, некорректно парсились параметры запроса в контроллере.\n### v1.1.5\n1. Добавил простые конструкторы для конфигурации.\n### v1.1.4\n1. В ServiceCollectionExtensions добавлен метод для добавления RabbitMQClient-a.\n### v1.1.3\n1. Переделаны контроллеры. Теперь они scoped.\n2. Убран метод FixRabbitMQControllers для IServiceCollection\n### v1.1.2\n1. Исправлена ошибка, когда при использовании метода AddRabbitMQController, MappedServer мог не видеть контроллеры.\n### v1.1.1 Большая переработка проекта\nФичи:\n1. Добавил проекты с примерами работы клиента и сервера;\n2. Добавил базовый интерфейс для контроллера;\n3. Добавил методы расширения IServiceCollection, через который идет настройка сервера и контроллеров;\n4. RabbitMQMappedServer теперь не требует сервиса самого сервера, а инициирует его сам.\n5. Убрал кучу лишних конструкторов;\n6. Добавил дебаг логирование в сервисы;\n\nФиксы:\n\n1. Исправлена ошибка, когда таймаут ожидания ответа на запрос учитывался в миллисекундах.\n2. Исправлена ошибка, когда не стартовал ресивер, если в настройках не указать, что он асинхронный;\n3. Исправил ошибку, когда при отправке ответа на запрос, MappedServer выдавал исключение.\n### v1.0.4\n1. Изменил алгоритм работы при остановке сервиса. Теперь только закрывает соединение.\n2. Добавил реализацию клиента (EBCEYS.RabbitMQ.Client). Через него возможна отправка сообщений и запросов на контроллеры.\n### v1.0.3\n1. Переименовал атрибут для методов RabbitMQ (RabbitMQMethodName -\u003e RabbitMQMethod).\n2. Исправил недоработку когда для парсинга сообщения в ресивере не использовались SerializerOptions.\n3. Добавил тесты для тестирования в своей среде (во время CI/CD запускаться не будут).\n\n\n## Планы на развитие\n1. Дебаг в зависимости от найденных ошибок / отзывов.\n1. Добавить Stream обмен.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Febceys%2Febceys.rabbitmq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Febceys%2Febceys.rabbitmq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Febceys%2Febceys.rabbitmq/lists"}