Radiofisik

my knowledge base

RabbitMq via Rebus

Создание проекта

Создадим простое приложение .net core в VS 2017 или как вариант через dotnet new web Добавим пакеты

dotnet add package Autofac
dotnet add package Autofac.Extensions.DependencyInjection
dotnet add package Rebus.Autofac 
dotnet add package Rebus.RabbitMq
dotnet add package Rebus
dotnet add package Serilog
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Sinks.Console
dotnet add package Rebus.Serilog
dotnet add package Serilog.Settings.Configuration

Сам ребус пока для простоты запустим через команду, По порту 8080 получим интерфейс управления, логин/пароль guest/guest

docker run -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 8080:15672 rabbitmq:3-management

Изменим Startup.cs чтобы проект использовал Autofac

 private IContainer _container;

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            var builder = new ContainerBuilder();
            builder.Populate(services);
            _container = builder.Build();
            return new AutofacServiceProvider(this._container);
        }

Добавим логирование в Program.cs

 public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
                    .ReadFrom.Configuration(hostingContext.Configuration)
                    .Enrich.FromLogContext()
                    .WriteTo.Console());

Создадим два Class library проекта Events - будем использовать как общий проект для хранения событий и EventHandlers - для обработчиков событий.

Создадим классы события

namespace Events
{
    public class TestEvent
    {
    }
}

и обработчика события

namespace EventHandlers
{
    public class TestEventHandler: IHandleMessages<TestEvent>
    {
        private readonly ILogger<TestEventHandler> _logger;

        public TestEventHandler(ILogger<TestEventHandler> logger)
        {
            _logger = logger;
        }

        public async Task Handle(TestEvent message)
        {
            _logger.LogInformation("received message");
        }
    }
}

зарегистрируем обработчики и настроим ребус

var types =
                GetType().Assembly.GetTypes()
                    .Where(type => typeof(IHandleMessages).IsAssignableFrom(type))
                    .ToArray();

            builder.RegisterTypes(types)
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();

            builder.RegisterRebus((configurer, context) => configurer
                    .Logging(l => l.Serilog())
                    .Transport(t => t.UseRabbitMq("amqp://docker", "testappqueue"))
                .Options(o => {
                    o.SetNumberOfWorkers(1);
                    o.SetMaxParallelism(30);
                }));

            builder.RegisterType<EventSubscriber>().AsImplementedInterfaces();

подпишемся и сгенерируем тестовое событие

namespace EventHandlers
{
    class EventSubscriber: IStartable
    {
        private readonly IBus _bus;
        private readonly ILogger<EventSubscriber> _logger;

        public EventSubscriber(IBus bus, ILogger<EventSubscriber> logger)
        {
            _bus = bus;
            _logger = logger;
        }

        public void Start()
        {
            _logger.LogInformation("subscribe to TestEvent");
            _bus.Subscribe<TestEvent>().Wait();

            //for test only
            _logger.LogInformation("publish TestEvent");
            _bus.Publish(new TestEvent());
        }
    }
}

в результате запуска в логе получим

[16:31:15 INF] Initializing RabbitMQ connection manager for transport with input queue testappqueue
[16:31:16 INF] Starting periodic task CleanupTrackedErrors with interval 00:00:10
[16:31:16 INF] Setting number of workers to 1
[16:31:16 INF] Bus Rebus 1 started
[16:31:16 INF] Successfully initialized consumer for testappqueue
[16:31:22 INF] subscribe to TestEvent
[16:31:22 INF] publish TestEvent
[16:31:23 INF] received message

Получившийся проект можно скачать по ссылке https://github.com/Radiofisik/RabbitTestApp

To be continued