Exemple #1
0
        private void SetupRabbitConsumer()
        {
            var factory = new ConnectionFactory
            {
                HostName = Configuration["RabbitMq:HostName"].Default("localhost"),
                Port     = Configuration["RabbitMq:Port"].ToInt(5672),
                UserName = Configuration["RabbitMq:UserName"].Default("guest"),
                Password = Configuration["RabbitMq:Password"].Default("guest")
            };

            var connection = factory.CreateConnection();

            var channel = connection.CreateModel();

            channel.ExchangeDeclare(exchange: "moorea", type: "direct");
            var queueName = channel.QueueDeclare().QueueName;

            channel.QueueBind(queue: queueName, exchange: "moorea", routingKey: "moorea-messages");
            channel.QueueBind(queue: queueName, exchange: "moorea", routingKey: "moorea-actions");

            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += (model, ea) =>
            {
                try
                {
                    var dbOptions = new DbContextOptionsBuilder <DatabaseContext>().UseSqlServer(Configuration["Data:ConnectionString"]).Options;
                    using (var dbContext = new DatabaseContext(dbOptions))
                    {
                        var body    = ea.Body;
                        var message = Encoding.UTF8.GetString(body);

                        if (message.StartsWith("{"))
                        {
                            var action = JsonConvert.DeserializeObject <IMessageQueueBaseAction>(message);
                            Console.WriteLine("{0} received action: {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm.ss"), action.Action);

                            var sw = new Stopwatch();
                            sw.Start();

                            if (ActionExecuter.Execute(dbContext, action))
                            {
                                channel.BasicAck(ea.DeliveryTag, false);
                            }

                            sw.Stop();
                            Console.WriteLine($"  tempo di esecuzione: {sw.ElapsedMilliseconds} ms");
                        }
                        else
                        {
                            Console.WriteLine("- received message: {0}", message);
                            channel.BasicAck(ea.DeliveryTag, false);
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("errore in gestione messaggio: {0}", e.Message);
                }
            };
            channel.BasicConsume(queueName, false, consumer);
        }