public async Task <Messages.SandwichResponse> OnPut(Messages.SandwichRequest request) { var result = new Messages.SandwichResponse(); using (var _queue = new Queue(_config["rabbitmq:url"], "customer")) { var reset = new AsyncManualResetEvent(); _queue.StartListening((ea, message) => { var response = JsonConvert.DeserializeObject <Messages.SandwichResponse>(message); result.Success = response.Success; result.Description = $"SUCCESS: {response.Description}"; result.Error = $"FAILED: {response.Error}"; reset.Set(); }); var requestToCook = new Messages.SandwichRequest { Meat = request.Meat, Bread = request.Bread, Cheese = request.Cheese, Lettuce = request.Lettuce }; _queue.SendMessage("sandwichmaker", Guid.NewGuid().ToString(), requestToCook); var task = reset.WaitAsync(); if (await Task.WhenAny(task, Task.Delay(10000)) != task) { result.Error = "The cook didn't get back to us in time, no sandwich"; } return(result); } }
public async Task <Messages.SandwichResponse> RequestSandwich(Messages.SandwichRequest request) { var result = new Messages.SandwichResponse(); var correlationId = Guid.NewGuid().ToString(); var lockEvent = new AsyncManualResetEvent(); _wip.StartWork(correlationId, lockEvent); try { _retryPolicy.Execute(() => { using (var _queue = new Queue(_config["rabbitmq:url"], "customer")) { _queue.SendMessage("sandwichmaker", correlationId, request); } }); var messageArrived = lockEvent.WaitAsync(); if (await Task.WhenAny(messageArrived, Task.Delay(10000)) == messageArrived) { result = _wip.FinalizeWork(correlationId); } else { result.Error = "The cook didn't get back to us in time, no sandwich"; result.Success = false; } } finally { _wip.FinalizeWork(correlationId); } return(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); }
public static async Task <Messages.SandwichResponse> RequestSandwich(Messages.SandwichRequest request, string queueUrl) { var result = new Messages.SandwichResponse(); var requestToCook = new Messages.SandwichRequest { Meat = request.Meat, Bread = request.Bread, Cheese = request.Cheese, Lettuce = request.Lettuce }; var correlationId = Guid.NewGuid().ToString(); var wipItem = new Services.WipItem { Lock = new AsyncManualResetEvent() }; Services.WorkInProgress.WipList.Add(correlationId, wipItem); try { using (var _queue = new Queue(queueUrl, "customer")) { _queue.SendMessage("sandwichmaker", correlationId, requestToCook); } var messageArrived = wipItem.Lock.WaitAsync(); if (await Task.WhenAny(messageArrived, Task.Delay(10000)) == messageArrived) { result = wipItem.Response; } else { result.Error = "The cook didn't get back to us in time, no sandwich"; result.Success = false; } } finally { Services.WorkInProgress.WipList.Remove(correlationId); } return(result); }
public async Task <Messages.SandwichResponse> OnPut(Messages.SandwichRequest request) { var outbound = new Messages.SandwichResponse(); var server = _config["sandwichmaker:url"] + "/api/sandwichmaker"; await _retryPolicy.Execute(async() => { using (var httpResponse = await _httpClient.PutAsJsonAsync(server, request)) { if (httpResponse.IsSuccessStatusCode) { outbound = await httpResponse.Content.ReadAsAsync <Messages.SandwichResponse>(); } else { outbound.Error = $"Couldn't reach sandwichmaker at {server}; Response: {httpResponse.ReasonPhrase}"; } } }); return(outbound); }
public async Task <Messages.SandwichResponse> OnPut(Messages.SandwichRequest request) { var result = new Messages.SandwichResponse(); return(result); }