Example #1
0
        private void HandleOrderEvent(EnvelopeRequestMessage message)
        {
            SynchronizedWriteLine("Order request received:\n" +
                                  "Order Id: " + ((RetailerOrderRequestMessage)message.Message).OrderId + "\n" +
                                  "Product Id: " + ((RetailerOrderRequestMessage)message.Message).ProductId + "\n" +
                                  "Country: " + ((RetailerOrderRequestMessage)message.Message).CustomerId
                                  );

            int     daysForDelivery = country == message.Country ? 2 : 10;
            decimal shippingCharge  = country == message.Country ? 5 : 10;

            Product requestedProduct = products.FirstOrDefault(p => p.ProductId == ((RetailerOrderRequestMessage)message.Message).ProductId);

            int itemsInStock = requestedProduct != null ? requestedProduct.ItemsInStock : 0;

            OrderReplyMessage replyMessage = new OrderReplyMessage
            {
                WarehouseId     = this.id,
                OrderId         = ((RetailerOrderRequestMessage)message.Message).OrderId,
                ProductId       = ((RetailerOrderRequestMessage)message.Message).ProductId,
                CustomerId      = ((RetailerOrderRequestMessage)message.Message).CustomerId,
                ItemsInStock    = itemsInStock,
                DaysForDelivery = daysForDelivery,
                ShippingCharge  = shippingCharge
            };

            // Send the reply message to the Retailer
            bus.Send(((RetailerOrderRequestMessage)message.Message).ReplyTo, replyMessage);
            SynchronizedWriteLine("Reply sent back to retailer");
        }
        public OrderReplyMessage SendRequest(EnvelopeRequestMessage request)
        {
            // Send an order request message to the Retailer
            bus.Send <EnvelopeRequestMessage>("retailerQueue", request);

            lock (this)
            {
                // Block this thread so that the Customer program will not exit.
                bool gotReply = Monitor.Wait(this, timeout);
                if (!gotReply)
                {
                    SynchronizedWriteLine("Timeout. The requested product is out of stock!");
                    return(null);
                }
                else
                {
                    return(replyMessage);
                }
            }
        }
Example #3
0
        private void HandleOrderRequest(EnvelopeRequestMessage request)
        {
            int customerId = ((CustomerOrderRequestMessage)request.Message).CustomerId;

            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Request received from customer " + customerId);
            Console.WriteLine("Trying to send the request to a local warehouse.");
            Console.ResetColor();

            OrderRequestMessageToLocalWarehouse requestMessage = new OrderRequestMessageToLocalWarehouse
            {
                ProductId  = ((CustomerOrderRequestMessage)request.Message).ProductId,
                CustomerId = ((CustomerOrderRequestMessage)request.Message).CustomerId,
                Country    = request.Country,
                OrderId    = ++orderId,
                ReplyTo    = replyQueueName
            };

            // Uses Topic Based Routing to send the request to a local warehouse. The topic
            // is requestMessage.Country.
            bus.Publish <EnvelopeRequestMessage>(wrapper.WrapMessage(requestMessage), requestMessage.Country);
        }