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 OnPost() { using (var _queue = new Queue(_config["rabbitmq:url"], "customer")) { var reset = new AsyncManualResetEvent(); _queue.StartListening((ea, message) => { var response = JsonConvert.DeserializeObject <Messages.SandwichReponse>(message); if (response.Success) { ReplyText = $"SUCCESS: {response.Description}"; } else { ReplyText = $"FAILED: {response.Error}"; } reset.Set(); }); var request = new Messages.SandwichRequest { Meat = TheMeat, Bread = TheBread, Cheese = TheCheese, Lettuce = TheLettuce }; _queue.SendMessage("sandwichmaker", Guid.NewGuid().ToString(), request); var task = reset.WaitAsync(); if (await Task.WhenAny(task, Task.Delay(10000)) != task) { ReplyText = "The cook didn't get back to us in time, no sandwich"; } } }
public async Task OnPost() { var request = new Messages.SandwichRequest { Meat = TheMeat, Bread = TheBread, Cheese = TheCheese, Lettuce = TheLettuce }; var server = _config["sandwichmaker:url"] + "/api/sandwichmaker"; await _retryPolicy.Execute(async() => { using (var httpResponse = await _httpClient.PutAsJsonAsync(server, request)) { if (httpResponse.IsSuccessStatusCode) { var result = await httpResponse.Content.ReadAsAsync <Messages.SandwichResponse>(); if (result.Success) { ReplyText = result.Description; } else { ReplyText = result.Error; } } else { throw new HttpRequestException( $"Couldn't reach sandwichmaker at {server}; Response: {httpResponse.ReasonPhrase}"); } } }); }
public async Task <Messages.SandwichResponse> OnPut(Messages.SandwichRequest request) { // TODO: uncomment //return await _requestor.RequestSandwich(request); // TODO: comment return(null); }
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); 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); }
private static void RequestIngredients(BasicDeliverEventArgs ea, Messages.SandwichRequest request) { var wip = new SandwichInProgress { ReplyTo = ea.BasicProperties.ReplyTo, CorrelationId = ea.BasicProperties.CorrelationId, Request = request }; _workInProgress.TryAdd(ea.BasicProperties.CorrelationId, wip); Console.WriteLine($"### Sandwichmaker making {request.Meat} on {request.Bread}{Environment.NewLine} from {ea.BasicProperties.CorrelationId} at {DateTime.Now}"); if (!string.IsNullOrEmpty(request.Meat)) { Console.WriteLine($"### Sandwichmaker requesting meat"); _bus.Publish("MeatBinRequest", ea.BasicProperties.CorrelationId, new Messages.MeatBinRequest { Meat = request.Meat }); } if (!string.IsNullOrEmpty(request.Bread)) { Console.WriteLine($"### Sandwichmaker requesting bread"); _bus.Publish("BreadBinRequest", ea.BasicProperties.CorrelationId, new Messages.BreadBinRequest { Bread = request.Bread }); } if (!string.IsNullOrEmpty(request.Cheese)) { Console.WriteLine($"### Sandwichmaker requesting cheese"); _bus.Publish("CheeseBinRequest", ea.BasicProperties.CorrelationId, new Messages.CheeseBinRequest { Cheese = request.Cheese }); } if (request.Lettuce) { Console.WriteLine($"### Sandwichmaker requesting lettuce"); _bus.Publish("LettuceBinRequest", ea.BasicProperties.CorrelationId, new Messages.LettuceBinRequest()); } SeeIfSandwichIsComplete(wip); }
public async Task OnPost() { var request = new Messages.SandwichRequest { Meat = TheMeat, Bread = TheBread, Cheese = TheCheese, Lettuce = TheLettuce }; var result = await Controllers.SandwichController.RequestSandwich(request, _config["rabbitmq:url"]); if (result.Success) { ReplyText = result.Description; } else { ReplyText = result.Error; } }
public async Task OnPost() { var request = new Messages.SandwichRequest { Meat = TheMeat, Bread = TheBread, Cheese = TheCheese, Lettuce = TheLettuce }; var result = await _requestor.RequestSandwich(request); if (result.Success) { ReplyText = result.Description; } else { ReplyText = result.Error; } }
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) { return(await RequestSandwich(request, _config["rabbitmq:url"])); }
public SandwichInProgress(Messages.SandwichRequest request) { Request = request; }
public async Task <Messages.SandwichResponse> OnPut(Messages.SandwichRequest request) { return(await _requestor.RequestSandwich(request)); }
public async Task <Messages.SandwichResponse> OnPut(Messages.SandwichRequest request) { var result = new Messages.SandwichResponse(); return(result); }