Пример #1
0
 public RabbitSubscriber(IBusConnection connection, RabbitSubscriberOptions options, IDecoder decoder, ILogger <RabbitSubscriber> logger)
 {
     _connection = connection ?? throw new ArgumentNullException(nameof(connection));
     _options    = options ?? throw new ArgumentNullException(nameof(options));
     _decoder    = decoder ?? throw new ArgumentNullException(nameof(decoder));
     _logger     = logger ?? throw new ArgumentNullException(nameof(logger));
 }
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApiWithBackgroundWorker.Subscriber", Version = "v1" });
            });

            services.AddSingleton<IMessagesRepository, InMemoryMessagesRepository>();

            var rabbitConfig = Configuration.GetSection("RabbitMQ");
            var exchangeName = rabbitConfig["Exchange"];
            var queueName = rabbitConfig["Queue"];
            var deadLetterExchange = rabbitConfig["DeadLetterExchange"];
            var deadLetterQueue = rabbitConfig["DeadLetterQueue"];
            var subscriberOptions = new RabbitSubscriberOptions(exchangeName, queueName, deadLetterExchange, deadLetterQueue);
            services.AddSingleton(subscriberOptions);

            var connectionFactory = new ConnectionFactory()
            {
                HostName = rabbitConfig["HostName"],
                UserName = rabbitConfig["UserName"],
                Password = rabbitConfig["Password"],
                Port = AmqpTcpEndpoint.UseDefaultPort,
                DispatchConsumersAsync = true // this is mandatory to have Async Subscribers
            };
            services.AddSingleton<IConnectionFactory>(connectionFactory);

            services.AddSingleton<IBusConnection, RabbitPersistentConnection>();
            services.AddSingleton<ISubscriber, RabbitSubscriber>();

            var channel = System.Threading.Channels.Channel.CreateBounded<Message>(100);
            services.AddSingleton(channel);

            services.AddSingleton<IProducer>(ctx =>
            {
                var channel = ctx.GetRequiredService<System.Threading.Channels.Channel<Message>>();
                var logger = ctx.GetRequiredService<ILogger<Producer>>();
                return new Producer(channel.Writer, logger);
            });

            services.AddSingleton<IEnumerable<IConsumer>>(ctx =>
            {
                var channel = ctx.GetRequiredService<System.Threading.Channels.Channel<Message>>();
                var logger = ctx.GetRequiredService<ILogger<Consumer>>();
                var repo = ctx.GetRequiredService<IMessagesRepository>();

                var consumers = Enumerable.Range(1, 10)
                                          .Select(i => new Consumer(channel.Reader, logger, i, repo))
                                          .ToArray();
                return consumers;
            });

            services.AddHostedService<BackgroundSubscriberWorker>();
        }
Пример #3
0
        static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)

        .ConfigureServices((hostContext, services) =>
        {
            services.AddLogging(logging => {
                var credentials = new NoAuthCredentials(hostContext.Configuration["Loki"]);

                var logger = new LoggerConfiguration()
                             .MinimumLevel.Debug()
                             .Enrich.WithMachineName()
                             .Enrich.WithEnvironmentUserName()
                             .WriteTo.LokiHttp(credentials)
                             .WriteTo.Console(new RenderedCompactJsonFormatter())
                             .CreateLogger();
                logging.AddSerilog(logger);
            });

            var encoder = new JsonEncoder();
            services.AddSingleton <IEncoder>(encoder);
            services.AddSingleton <IDecoder>(encoder);

            services.AddSingleton <IConnectionFactory>(ctx =>
            {
                var config            = ctx.GetRequiredService <IConfiguration>();
                var rabbitConfig      = config.GetSection("RabbitMQ");
                var connectionFactory = new ConnectionFactory()
                {
                    HostName = rabbitConfig["HostName"],
                    UserName = rabbitConfig["UserName"],
                    Password = rabbitConfig["Password"],
                    Port     = AmqpTcpEndpoint.UseDefaultPort,
                    DispatchConsumersAsync = true
                };
                return(connectionFactory);
            });

            services.AddSingleton <IBusConnection, RabbitPersistentConnection>();
            services.AddSingleton <ICommandResolver>(ctx =>
            {
                var decoder    = ctx.GetRequiredService <IDecoder>();
                var assemblies = new[]
                {
                    typeof(ProcessIncoming).Assembly
                };
                return(new CommandResolver(decoder, assemblies));
            });

            services.AddSingleton <ISubscriber>(ctx =>
            {
                var connection   = ctx.GetRequiredService <IBusConnection>();
                var decoder      = ctx.GetRequiredService <IDecoder>();
                var config       = ctx.GetRequiredService <IConfiguration>();
                var logger       = ctx.GetRequiredService <ILogger <RabbitSubscriber> >();
                var rabbitConfig = config.GetSection("RabbitMQ");

                var exchangeName       = rabbitConfig["Exchange"];
                var queueName          = rabbitConfig["Queue"];
                var deadLetterExchange = rabbitConfig["DeadLetterExchange"];
                var deadLetterQueue    = rabbitConfig["DeadLetterQueue"];
                var options            = new RabbitSubscriberOptions(exchangeName, queueName, deadLetterExchange, deadLetterQueue);

                return(new RabbitSubscriber(connection, options, decoder, logger));
            });

            services.AddSingleton(ctx =>
            {
                var config = ctx.GetRequiredService <IConfiguration>();

                var mongoCfg = config.GetSection("Mongo");
                var connStr  = mongoCfg["ConnectionString"];
                return(new MongoClient(connectionString: connStr));
            })
            .AddSingleton(ctx =>
            {
                var config = ctx.GetRequiredService <IConfiguration>();

                var mongoCfg = config.GetSection("Mongo");
                var dbName   = mongoCfg["DbName"];
                var client   = ctx.GetRequiredService <MongoClient>();
                var database = client.GetDatabase(dbName);
                return(database);
            }).AddSingleton <IDbContext, DbContext>();

            services.AddMediatR(new[] {
                typeof(ProcessIncoming),
                typeof(ProcessIncomingHandler)
            });

            services.AddHostedService <MessagesBackgroundService>();
        });