public async void MessageBrokerConnection(IServiceCollection services) { var exchanges = Configuration.GetSection("RbSetting:Subscription").Get <List <string> >(); var factory = new ConnectionFactory() { HostName = Configuration["ConnectionString:RbConn"] }; factory.RequestedHeartbeat = 60; factory.AutomaticRecoveryEnabled = true; factory.NetworkRecoveryInterval = TimeSpan.FromSeconds(15); services.AddSingleton <Publisher>(s => new Publisher(factory, Configuration["RbSetting:Exchange"], Configuration["RbSetting:Queue"])); var retryPolicy = Policy.Handle <BrokerUnreachableException>().WaitAndRetryAsync(5, i => TimeSpan.FromSeconds(10)); await retryPolicy.ExecuteAsync(async() => { await Task.Run(() => { try { Connection = factory.CreateConnection(); } catch (Exception) { throw; } }); }); var _channel = Connection.CreateModel(); var queueName = _channel.QueueDeclare().QueueName; var consumer = services.AddSingleton <ISubscriber>(s => new Subscriber(exchanges, Connection, _channel, queueName)).BuildServiceProvider().GetService <ISubscriber>().Start(); foreach (var ex in exchanges) { _channel.QueueBind(queue: queueName, exchange: ex, routingKey: ""); } var listener = new Listener(services.BuildServiceProvider().GetService <IRepository>()); consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); listener.AddCommand(message); }; }
public async void MessageBrokerConnection(IServiceCollection services) { //Description: Seznam zájmových Exchange ke konzumaci událostí var exchanges = Configuration.GetSection("RbSetting:Subscription").Get <List <string> >(); //Description: Nastavení pøipojení k MB var factory = new ConnectionFactory() { HostName = Configuration["ConnectionString:RbConn"] }; //Description: Nastavení cyklické kontroly stavu, automatického obnovení a intervalu factory.RequestedHeartbeat = 60; factory.AutomaticRecoveryEnabled = true; factory.NetworkRecoveryInterval = TimeSpan.FromSeconds(15); //Description: Vytvoøení objektu pro Poskytnutí metod Publikace událostí //Description: Pøidìlení základního Exchange a fronty servisu. services.AddSingleton <Publisher>(s => new Publisher(factory, Configuration["RbSetting:Exchange"], Configuration["RbSetting:Queue"])); //Description: Nastavení politiky reakce na vyjímku pøi nedostupnosti //Description: v pøípadì vyjímky opakovat 5krát, každých 10 vteøin var retryPolicy = Policy .Handle <BrokerUnreachableException>() .WaitAndRetryAsync(5, i => TimeSpan.FromSeconds(10)); await retryPolicy.ExecuteAsync(async() => { await Task.Run(() => { try { //Description: Navázání pøipojení s Message Broker Connection = factory.CreateConnection(); //Description: Vytvoøení kanálu na MB pro pøipojení servisu var _channel = Connection.CreateModel(); //Description: Deklarace fronty pro servis var queueName = _channel.QueueDeclare().QueueName; //Description: Vytvoøení objektu singleton Konzumaci naslouchání aktivity MB a Konzumace událostí var consumer = services.AddSingleton <ISubscriber>(s => new Subscriber(exchanges, Connection, _channel, queueName)) .BuildServiceProvider().GetService <ISubscriber>().Start(); //Description: Návázání spojení na zájmové Exchange foreach (var ex in exchanges) { _channel.QueueBind(queue: queueName, exchange: ex, routingKey: ""); } //Description: Vytvoøení objektu s metodami reakce na konzumované události var listener = new Listener(services.BuildServiceProvider().GetService <IRepository>()); //Description: Zpracování konzumované zprávy z Message Broker consumer.Received += (model, ea) => { var body = ea.Body; var message = Encoding.UTF8.GetString(body); //Description: Pøedání zprávy pro nasmìrování a zpracování. listener.AddCommand(message); }; } catch (Exception) { //ToDo: Prostor pro logování vyjímky a další reakce } }); }); }