Example #1
0
        private async Task ReturnInventory(SandwichInProgress wip)
        {
            var requests = new List <Task>
            {
                RequestBread(wip, new Messages.BreadBinRequest {
                    Bread = wip.Request.Bread, Returning = true
                }),
                RequestMeat(wip, new Messages.MeatBinRequest {
                    Meat = wip.Request.Meat, Returning = true
                }),
                RequestCheese(wip, new Messages.CheeseBinRequest {
                    Cheese = wip.Request.Cheese, Returning = true
                }),
                RequestLettuce(wip, new Messages.LettuceBinRequest {
                    Returning = true
                })
            };

            var timeout = Task.Delay(10000);

            if (await Task.WhenAny(Task.WhenAll(requests), timeout) == timeout)
            {
                Console.WriteLine($"### Timeout returning inventory");
                throw new TimeoutException("ReturnInventory");
            }
        }
Example #2
0
 private void HandleMessage(Messages.LettuceBinResponse response, SandwichInProgress wip)
 {
     lock (wip)
     {
         wip.GotLettuce = response.Success;
     }
 }
Example #3
0
 private void HandleMessage(Messages.BreadBinResponse response, SandwichInProgress wip)
 {
     lock (wip)
     {
         wip.GotBread = response.Success;
     }
 }
Example #4
0
        public async Task <Messages.SandwichResponse> OnPut(Messages.SandwichRequest request)
        {
            Console.WriteLine($"### Sandwichmaker making {request.Meat} on {request.Bread}{Environment.NewLine} at {DateTime.Now}");
            var wip = new SandwichInProgress(request);

            return(result);
        }
Example #5
0
        private Task RequestMeat(SandwichInProgress wip, Messages.MeatBinRequest request)
        {
            if (string.IsNullOrEmpty(wip.Request.Meat))
            {
                return(Task.CompletedTask);
            }

            return(_retryPolicy.ExecuteAndCapture <Task>(() =>
                                                         _httpClient.PutAsJsonAsync(
                                                             _config["Meatservice:url"] + "/api/Meatbin",
                                                             request).
                                                         ContinueWith(async(e) => HandleMessage(await e.Result.Content.ReadAsAsync <Messages.MeatBinResponse>(), wip))
                                                         ).Result);
        }
Example #6
0
        private Task RequestLettuce(SandwichInProgress wip, Messages.LettuceBinRequest request)
        {
            if (!wip.Request.Lettuce)
            {
                return(Task.CompletedTask);
            }

            return(_retryPolicy.ExecuteAndCapture <Task>(() =>
                                                         _httpClient.PutAsJsonAsync(
                                                             _config["Lettuceservice:url"] + "/api/Lettucebin",
                                                             request).
                                                         ContinueWith(async(e) => HandleMessage(await e.Result.Content.ReadAsAsync <Messages.LettuceBinResponse>(), wip))
                                                         ).Result);
        }
Example #7
0
        public async Task <Messages.SandwichResponse> OnPut(Messages.SandwichRequest request)
        {
            Console.WriteLine($"### Sandwichmaker making {request.Meat} on {request.Bread}{Environment.NewLine} at {DateTime.Now}");
            var wip = new SandwichInProgress(request);

            var requests = new List <Task>
            {
                RequestBread(wip, new Messages.BreadBinRequest {
                    Bread = wip.Request.Bread
                }),
                RequestMeat(wip, new Messages.MeatBinRequest {
                    Meat = wip.Request.Meat
                }),
                RequestCheese(wip, new Messages.CheeseBinRequest {
                    Cheese = wip.Request.Cheese
                }),
                RequestLettuce(wip, new Messages.LettuceBinRequest {
                    Returning = false
                })
            };

            var result = new Messages.SandwichResponse();

            var timeout = Task.Delay(10000);

            if (await Task.WhenAny(Task.WhenAll(requests), timeout) == timeout)
            {
                await ReturnInventory(wip);

                result.Error   = "The cook didn't get back to us in time, no sandwich";
                result.Success = false;
                return(result);
            }

            result.Success = !wip.Failed;
            if (result.Success)
            {
                result.Description = wip.GetDescription();
            }
            else
            {
                result.Error = wip.GetFailureReason();
                await ReturnInventory(wip);
            }
            return(result);
        }