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); } } }
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); }