예제 #1
0
        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);
            };
        }
예제 #2
0
        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
                    }
                });
            });
        }