{"id":17892830,"url":"https://github.com/gokgokalp/metrobus","last_synced_at":"2025-03-23T02:31:42.163Z","repository":{"id":41494399,"uuid":"81834180","full_name":"GokGokalp/MetroBus","owner":"GokGokalp","description":"Lightweight messaging wrapper of MassTransit","archived":false,"fork":false,"pushed_at":"2020-10-28T19:57:46.000Z","size":71,"stargazers_count":72,"open_issues_count":4,"forks_count":22,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-05-28T19:39:26.089Z","etag":null,"topics":["consumer","dotnet","dotnet-core","dotnetcore","masstransit","message-bus","messaging","rabbitmq","service-bus"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GokGokalp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-02-13T14:34:30.000Z","updated_at":"2023-11-28T14:27:58.000Z","dependencies_parsed_at":"2022-09-21T10:39:58.423Z","dependency_job_id":null,"html_url":"https://github.com/GokGokalp/MetroBus","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/GokGokalp%2FMetroBus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GokGokalp%2FMetroBus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GokGokalp%2FMetroBus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GokGokalp%2FMetroBus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GokGokalp","download_url":"https://codeload.github.com/GokGokalp/MetroBus/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221842405,"owners_count":16890134,"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":["consumer","dotnet","dotnet-core","dotnetcore","masstransit","message-bus","messaging","rabbitmq","service-bus"],"created_at":"2024-10-28T14:45:02.778Z","updated_at":"2024-10-28T14:45:03.616Z","avatar_url":"https://github.com/GokGokalp.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"#   **MetroBus**\n------------------------------\n\n![alt tag](https://raw.githubusercontent.com/GokGokalp/MetroBus/master/misc/metrobus-logo.png)\n\nLightweight messaging wrapper of _MassTransit_\n\n[![NuGet version](https://badge.fury.io/nu/MetroBus.svg)](https://badge.fury.io/nu/MetroBus)\n[![NuGet version](https://badge.fury.io/nu/MetroBus.Core.svg)](https://badge.fury.io/nu/MetroBus.Core)\n[![NuGet version](https://badge.fury.io/nu/MetroBus.Autofac.svg)](https://badge.fury.io/nu/MetroBus.Autofac)\n[![NuGet version](https://badge.fury.io/nu/MetroBus.Microsoft.Extensions.DependencyInjection.svg)](https://badge.fury.io/nu/MetroBus.Microsoft.Extensions.DependencyInjection)\n\n### NuGet Packages\n``` \n\u003e dotnet add package MetroBus\n\u003e dotnet add package MetroBus.Autofac\n\u003e dotnet add package MetroBus.Microsoft.Extensions.DependencyInjection\n```\n\n#### Supports:\n- .NET Standard 2.0\n\n#### Features:\n- Currently only supports RabbitMQ transport\n- Provides easy way to create **Producer** and **Consumer** for Pub/Sub\n- Provides easy way to handle **Request/Response** conversations\n- Provides message scheduling\n- Includes optional incremental auto retry policy\n- Includes optional circuit breaker\n- Includes optional rate limiter\n- Autofac support\n- Microsoft.Extensions.DependencyInjection support\n\nUsage:\n-----\n\nInitializing bus instance for **Producer**:\n\n```cs\n// For events\nIBusControl bus = MetroBusInitializer.Instance.UseRabbitMq(rabbitMqUri, rabbitMqUserName, rabbitMqPassword)\n\t\t\t\t\t.InitializeEventProducer();\n\n// For commands\nISendEndpoint bus = MetroBusInitializer.Instance.UseRabbitMq(rabbitMqUri, rabbitMqUserName, rabbitMqPassword)\n                    .InitializeCommandProducer(queueName);\n```\n\nafter bus instance initializing then you can use _Send_ or _Publish_ methods.\n\n```cs\n// For events\nawait bus.Publish\u003cTEvent\u003e(new\n{\n    SomeProperty = SomeValue\n}));\n\n// For commands\nawait bus.Send\u003cTCommand\u003e(new\n{\n    SomeProperty = SomeValue\n}));\n```\n\n\nusing **Consumer**:\n\n```cs\nstatic void Main(string[] args)\n{\n\tIBusControl bus = MetroBusInitializer.Instance\n                        .UseRabbitMq(string rabbitMqUri, string rabbitMqUserName, string rabbitMqPassword)\n                        .RegisterConsumer\u003cTCommandConsumer\u003e(string queueName)\n                        .RegisterConsumer\u003cTEventConsumer\u003e(string queueName)\n                        .Build();\n\n\tbus.Start();\n\n\t//if you want to stop\n\tbus.Stop();\n\n\tConsole.ReadLine();\n}\n```\n\n\n_TCommandConsumer_ could like below:\n\n```cs\npublic class TCommandConsumer : IConsumer\u003cTCommand\u003e\n{\n    public async Task Consume(ConsumeContext\u003cTCommand\u003e context)\n    {\n        var command = context.Message;\n\n\t\t//do something...\n        await Console.Out.WriteAsync($\"{command.SomeProperty}\");\n    }\n}\n```\n\nInitializing bus instance for Request/Response conversation:\n\n```cs\nIRequestClient\u003cTRequest, TResponse\u003e client = MetroBusInitializer.Instance.UseRabbitMq(string rabbitMqUri, string rabbitMqUserName, string rabbitMqPassword)\n                                                                    .InitializeRequestClient\u003cTRequest, TResponse\u003e(string queueName);\n\nTResponse result = await client.Request(new TRequest\n{\n    Command = \"Say hello!\"\n});\n```\n\nand consumer for Request/Response conversation could like below:\n\n```cs\npublic class TCommandConsumer : IConsumer\u003cTRequest\u003e\n{\n    public async Task Consume(ConsumeContext\u003cTRequest\u003e context)\n    {\n        var command = context.Message;\n\n\t\t//do something...\n        await Console.Out.WriteAsync($\"{command.SomeProperty}\");\n\n\t\t//and\n\t\tcontext.Respond(new TRequest\n            {\n                Command = \"Hello!\"\n            });\n    }\n}\n```\n\nusing **Consumer** with Microsoft.Extensions.DependencyInjection:\n```cs\nnew HostBuilder ()\n    .ConfigureServices ((hostContext, services) =\u003e\n    {\n        services.AddMetroBus (x =\u003e\n        {\n            x.AddConsumer\u003cTCommandConsumer\u003e();\n            x.AddConsumer\u003cTEventConsumer\u003e();\n        });\n\n        services.AddSingleton\u003cIBusControl\u003e (provider =\u003e MetroBusInitializer.Instance\n                .UseRabbitMq (string rabbitMqUri, string rabbitMqUserName, string rabbitMqPassword)\n                .RegisterConsumer\u003cTCommandConsumer\u003e(\"foo.command.queue\", provider)\n                .RegisterConsumer\u003cTEventConsumer\u003e(\"foo.event.queue\", provider)\n                .Build ())\n            .BuildServiceProvider ();\n\n        services.AddHostedService\u003cBusService\u003e ();\n    })\n    .RunConsoleAsync ().Wait ();\n\n\npublic class BusService : IHostedService\n{\n    private readonly IBusControl _busControl;\n\n    public BusService(IBusControl busControl)\n    {\n        _busControl = busControl;\n    }\n\n    public Task StartAsync(CancellationToken cancellationToken)\n    {\n        return _busControl.StartAsync(cancellationToken);\n    }\n\n    public Task StopAsync(CancellationToken cancellationToken)\n    {\n        return _busControl.StopAsync(cancellationToken);\n    }\n}\n```\n\n**PS**: **Publisher** and **Consumer** services must be used same _TCommand_ or _TEvent_ interfaces. This is important for MassTransit integration. Also one other thing is _rabbitMqUri_ parameter must start with \"rabbitmq://\" prefix.\n\n\nThere are several options you can set via fluent interface:\n- `.UseRetryPolicy().UseIncrementalRetryPolicy(int retryLimit, TimeSpan? initialIntervalTime, TimeSpan? intervalIncrementTime, params Exception[] retryOnSpecificExceptionType).Then()`\n- `.UseCircuitBreaker(int tripThreshold, int activeThreshold, TimeSpan? resetInterval)`\n- `.UseRateLimiter(int rateLimit, TimeSpan? interval)`\n- `.UseMessageScheduler()`\n- `.UseDelayedExchangeMessageScheduler()`\n- `.UseConcurrentConsumerLimit(int concurrencyLimit)`","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgokgokalp%2Fmetrobus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgokgokalp%2Fmetrobus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgokgokalp%2Fmetrobus/lists"}