Пример #1
0
        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";
                }
            }
        }
Пример #3
0
        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);
        }
Пример #6
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);
        }
Пример #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);
        }
Пример #8
0
        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;
            }
        }
Пример #10
0
        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);
        }
Пример #12
0
        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"]));
 }
Пример #14
0
 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);
        }