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>(); }
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>(); });