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"); } }
private void HandleMessage(Messages.LettuceBinResponse response, SandwichInProgress wip) { lock (wip) { wip.GotLettuce = response.Success; } }
private void HandleMessage(Messages.BreadBinResponse response, SandwichInProgress wip) { lock (wip) { wip.GotBread = response.Success; } }
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); }
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); }
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); }
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); }