Пример #1
0
 private static void InitDB()
 {
     using (ECommerce2Context db = new ECommerce2Context()) {
         IEnumerable <string> pendings = db.Database.GetPendingMigrations();
         if (pendings != null)
         {
             db.Database.Migrate();
             Console.WriteLine("DB Migrated");
         }
         else
         {
             Console.WriteLine("DB Migration Not Needed");
         }
     }
 }
Пример #2
0
        public OrderResponseManager()
        {
            redis   = new RedisCacheManager();
            factory = new ConnectionFactory()
            {
                HostName = Common.Constants.InternalHost
            };

            var connection = factory.CreateConnection();
            var channel    = connection.CreateModel();


            channel.ExchangeDeclare(exchange: Common.Constants.RabbitMQExchange, type: "direct");

            channel.QueueDeclare(queue: Common.Constants.RabbitMQOrderQueueName,
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            channel.QueueBind(queue: Common.Constants.RabbitMQOrderQueueName,
                              exchange: Common.Constants.RabbitMQExchange,
                              routingKey: Common.Constants.RabbitMQOrderRoutingKey);

            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += (model, ea) =>
            {
                byte[]            body            = ea.Body.ToArray();
                string            orderRequestStr = Encoding.UTF8.GetString(body);
                OrderRequestModel orderRequest    = JsonConvert.DeserializeObject <OrderRequestModel>(orderRequestStr);
                while (!redis.SetKey(orderRequest.ProductId, "lock", TimeSpan.FromSeconds(3)))
                {
                    Console.WriteLine("Waiting For Access To => {0}", orderRequest.ProductId);
                    Thread.Sleep(100);
                }
                using (ECommerce2Context db = new ECommerce2Context())
                {
                    Product p = db.Products.FirstOrDefault(x => x.ProductId == orderRequest.ProductId);
                    if (p != null)
                    {
                        OrderResponseModel orderResponse = new OrderResponseModel()
                        {
                            IsError     = true,
                            Quantity    = orderRequest.Quantity,
                            ProductId   = orderRequest.ProductId,
                            ProductName = p.ProductName
                        };
                        if ((p.Quantity - orderRequest.Quantity) > 0)
                        {
                            Console.WriteLine("{0} x '{1}' Product Sold For (Customer Id = '{2}')", orderRequest.Quantity, p.ProductName, orderRequest.RequestCustomerId);
                            p.Quantity -= orderRequest.Quantity;
                            db.SaveChanges();
                            orderResponse.IsError = false;
                        }
                        else
                        {
                            Console.WriteLine("{0} x '{1}' Product Could't Sold (Customer Id = '{2}') - SQ: {3}", orderRequest.Quantity, p.ProductName, orderRequest.RequestCustomerId, p.Quantity);
                        }

                        string orderResponseStr = JsonConvert.SerializeObject(orderResponse);
                        byte[] requestBody      = Encoding.UTF8.GetBytes(orderResponseStr);
                        try
                        {
                            channel.BasicPublish(exchange: Common.Constants.RabbitMQExchange, routingKey: Common.Constants.RabbitMQCustomerPrefix + orderRequest.RequestCustomerId, basicProperties: null, body: requestBody);
                        }
                        catch (Exception)
                        {
                            Console.WriteLine("Customer Gone Away => {0}", orderRequest.RequestCustomerId);
                        }
                    }
                    else
                    {
                        Console.WriteLine("Product Cannot Found => {0} ", orderRequest.ProductId);
                    }
                }
                redis.RemoveLockKey(orderRequest.ProductId);//RELASE LOCK
            };
            channel.BasicConsume(queue: Common.Constants.RabbitMQOrderQueueName,
                                 autoAck: true,
                                 consumer: consumer);
        }