protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Pizza worker running at: {time}", DateTimeOffset.Now); while (!stoppingToken.IsCancellationRequested) { try { var msg = await PizzaOrdersQueue.GetMessageAsync(); if (msg != null) { var order = JsonConvert.DeserializeObject <Order>(msg.AsString); using (IServiceScope scope = _serviceProvider.CreateScope()) { // Save the order to the DB var context = scope.ServiceProvider.GetRequiredService <PizzaStoreContext>(); order.Status = "Preparing"; context.Orders.Attach(order); await context.SaveChangesAsync(); await PizzaOrdersQueue.DeleteMessageAsync(msg); _logger.LogInformation($"Preparing order {order.OrderId}"); // Send Preparing status var httpClient = new HttpClient { BaseAddress = new Uri("https://localhost:5001") }; var client = GrpcClient.Create <PizzaOrderStatusClient>(httpClient); var ack = await client.SendStatusAsync(order.ToStatusUpdate()); _logger.LogInformation($"Status update ack: {ack.Message}"); await Task.Delay(10000, stoppingToken); // Prepare the pizza // Put the pizza order on the delivery queue await PizzaDeliveryQueue.AddMessageAsync(new CloudQueueMessage(JsonConvert.SerializeObject(order))); _logger.LogInformation($"Order {order.OrderId} sent for delivery"); } } } catch (Exception ex) { _logger.LogError(ex, $"Error preparing pizza order: {ex.Message}"); } // Mandatory Pizza Worker break await Task.Delay(1000, stoppingToken); } }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Pizza worker running at: {time}", DateTimeOffset.Now); while (!stoppingToken.IsCancellationRequested) { try { var msg = await PizzaOrdersQueue.GetMessageAsync().ConfigureAwait(false); if (msg != null) { var order = JsonConvert.DeserializeObject <Order>(msg.AsString); using (IServiceScope scope = _serviceProvider.CreateScope()) { // Save the order to the DB var context = scope.ServiceProvider.GetRequiredService <PizzaStoreContext>(); order.Status = "Preparing"; context.Orders.Update(order); await context.SaveChangesAsync().ConfigureAwait(false); await PizzaOrdersQueue.DeleteMessageAsync(msg).ConfigureAwait(false); _logger.LogInformation($"Preparing order {order.RequestId}"); // Send Preparing status StatusUpdate statusUpdate = order.ToStatusUpdate(); PizzaOrderStatusClient client = default; HttpClient httpClient = default; Ack ack = default; var httpHandler = new HttpClientHandler(); // Return `true` to allow certificates that are untrusted/invalid httpHandler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; httpHandler.UseProxy = false; var channel = GrpcChannel.ForAddress("https://localhost:54001/", new GrpcChannelOptions { HttpHandler = httpHandler }); client = new PizzaOrderStatusClient(channel); //httpClient = new HttpClient { BaseAddress = new Uri(UriString) }; //httpClient.Timeout = new TimeSpan(0, 3, 0); //client = GrpcClient.Create<PizzaOrderStatusClient>(httpClient); ack = await client.SendStatusAsync(statusUpdate); _logger.LogInformation($"Status update ack: {ack.Message}"); await Task.Delay(10000, stoppingToken); // Prepare the pizza // Put the pizza order on the delivery queue await PizzaDeliveryQueue.AddMessageAsync(new CloudQueueMessage(JsonConvert.SerializeObject(order))); _logger.LogInformation($"Order {order.RequestId} sent for delivery"); } } } catch (Exception ex) { _logger.LogError(ex, $"Error preparing pizza order: {ex.Message}"); } // Mandatory Pizza Worker break await Task.Delay(1000, stoppingToken); } }