From 460fc997af5bba130608bfe2a9d39811313a8f05 Mon Sep 17 00:00:00 2001 From: Unai Zorrilla Castro Date: Mon, 21 May 2018 15:01:29 +0200 Subject: [PATCH] Create Generic Host prototype for background task in order to be reviewed --- eShopOnContainers-ServicesAndWebApps.sln | 51 +++++ .../Ordering.BackgroundTasks.csproj | 5 +- .../Configuration/BackgroundTaskSettings.cs | 17 ++ .../GracePeriodConfirmedIntegrationEvent.cs | 12 ++ .../Ordering.BackgroundTasksHost.csproj | 32 ++++ .../Ordering.BackgroundTasksHost/Program.cs | 177 ++++++++++++++++++ .../Tasks/Base/BackgroundTask.cs | 81 ++++++++ .../Tasks/GracePeriodManagerTask.cs | 92 +++++++++ .../appsettings.json | 27 +++ 9 files changed, 493 insertions(+), 1 deletion(-) create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs create mode 100644 src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index f9e3e654e..d759749e8 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -128,6 +128,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.BackgroundTasks", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ordering.SignalrHub", "src\Services\Ordering\Ordering.SignalrHub\Ordering.SignalrHub.csproj", "{E1D2B260-4E7F-4A88-BC13-9910F7C44623}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ordering.BackgroundTasksHost", "src\Services\Ordering\Ordering.BackgroundTasksHost\Ordering.BackgroundTasksHost.csproj", "{CA566CD5-A49A-47F7-BDC9-592E36DAF74E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Ad-Hoc|Any CPU = Ad-Hoc|Any CPU @@ -1534,6 +1536,54 @@ Global {E1D2B260-4E7F-4A88-BC13-9910F7C44623}.Release|x64.Build.0 = Release|Any CPU {E1D2B260-4E7F-4A88-BC13-9910F7C44623}.Release|x86.ActiveCfg = Release|Any CPU {E1D2B260-4E7F-4A88-BC13-9910F7C44623}.Release|x86.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|ARM.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhone.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x64.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x64.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x86.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.AppStore|x86.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|ARM.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|ARM.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhone.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x64.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x64.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x86.ActiveCfg = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Debug|x86.Build.0 = Debug|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|Any CPU.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|ARM.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|ARM.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhone.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhone.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x64.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x64.Build.0 = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x86.ActiveCfg = Release|Any CPU + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1589,6 +1639,7 @@ Global {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1} = {28C0F5C8-4849-4035-80AB-45639424E73F} {7D63ED4A-3EDA-4BBA-8BBA-F46BD6430931} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} {E1D2B260-4E7F-4A88-BC13-9910F7C44623} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} + {CA566CD5-A49A-47F7-BDC9-592E36DAF74E} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj index 9f832bdfd..e61a12068 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj +++ b/src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj @@ -7,7 +7,10 @@ - + + + + diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs new file mode 100644 index 000000000..3c0165e7b --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/Configuration/BackgroundTaskSettings.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Ordering.BackgroundTasksHost.Configuration +{ + public class BackgroundTaskSettings + { + public string ConnectionString { get; set; } + + public string EventBusConnection { get; set; } + + public int GracePeriodTime { get; set; } + + public int CheckUpdateTime { get; set; } + } +} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs new file mode 100644 index 000000000..28a4b3492 --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/IntegrationEvents/GracePeriodConfirmedIntegrationEvent.cs @@ -0,0 +1,12 @@ +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events; + +namespace Ordering.BackgroundTasksHost.IntegrationEvents +{ + public class GracePeriodConfirmedIntegrationEvent : IntegrationEvent + { + public int OrderId { get; } + + public GracePeriodConfirmedIntegrationEvent(int orderId) => + OrderId = orderId; + } +} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj b/src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj new file mode 100644 index 000000000..6a5bedc9d --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/Ordering.BackgroundTasksHost.csproj @@ -0,0 +1,32 @@ + + + + Exe + netcoreapp2.1 + + + + + + + + + PreserveNewest + + + + + + + + + + + + + + + + + + diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs new file mode 100644 index 000000000..52668152a --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/Program.cs @@ -0,0 +1,177 @@ +using Autofac.Extensions.DependencyInjection; +using Autofac; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System; +using Ordering.BackgroundTasksHost.Configuration; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus; +using Microsoft.Azure.ServiceBus; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ; +using RabbitMQ.Client; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; +using Ordering.BackgroundTasksHost.Tasks; + +namespace Ordering.BackgroundTasksHost +{ + class Program + { + static void Main(string[] args) + { + using (var host = CreateHost(args)) + { + host.Start(); + + host.WaitForShutdown(); + } + } + + static IHost CreateHost(string[] args) + { + var host = new HostBuilder() + .ConfigureAppConfiguration((hostContext, configApp) => + { + configApp.AddEnvironmentVariables(); + configApp.AddJsonFile("appsettings.json", optional: true); + configApp.AddJsonFile( + $"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", + optional: true); + configApp.AddCommandLine(args); + + }) + .ConfigureServices(services => + { + var configuration = services.BuildServiceProvider() + .GetRequiredService(); + + services.AddOptions() + .Configure(configuration) + .RegisterBus(configuration) + .RegisterHostedServices(); + + }) + .UseServiceProviderFactory(new AutofacServiceProviderFactory()) + .Build(); + + return host; + } + + + } + + class AutofacServiceProviderFactory + : IServiceProviderFactory + { + public ContainerBuilder CreateBuilder(IServiceCollection services) + { + var containerBuilder = new ContainerBuilder(); + containerBuilder.Populate(services); + + return containerBuilder; + } + + public IServiceProvider CreateServiceProvider(ContainerBuilder containerBuilder) + { + return new AutofacServiceProvider(containerBuilder.Build()); + } + } + + static class ServiceCollectionExtensions + { + public static IServiceCollection RegisterBus(this IServiceCollection services, IConfiguration configuration) + { + if (configuration.GetValue("AzureServiceBusEnabled")) + { + services.AddSingleton(sp => + { + var logger = sp.GetRequiredService>(); + + var serviceBusConnectionString = configuration["EventBusConnection"]; + var serviceBusConnection = new ServiceBusConnectionStringBuilder(serviceBusConnectionString); + + return new DefaultServiceBusPersisterConnection(serviceBusConnection, logger); + }); + } + else + { + services.AddSingleton(sp => + { + var logger = sp.GetRequiredService>(); + + + var factory = new ConnectionFactory() + { + HostName = configuration["EventBusConnection"] + }; + + if (!string.IsNullOrEmpty(configuration["EventBusUserName"])) + { + factory.UserName = configuration["EventBusUserName"]; + } + + if (!string.IsNullOrEmpty(configuration["EventBusPassword"])) + { + factory.Password = configuration["EventBusPassword"]; + } + + var retryCount = 5; + if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"])) + { + retryCount = int.Parse(configuration["EventBusRetryCount"]); + } + + return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount); + }); + } + + + var subscriptionClientName = configuration["SubscriptionClientName"]; + + if (configuration.GetValue("AzureServiceBusEnabled")) + { + services.AddSingleton(sp => + { + var serviceBusPersisterConnection = sp.GetRequiredService(); + var iLifetimeScope = sp.GetRequiredService(); + var logger = sp.GetRequiredService>(); + var eventBusSubcriptionsManager = sp.GetRequiredService(); + + return new EventBusServiceBus(serviceBusPersisterConnection, logger, + eventBusSubcriptionsManager, subscriptionClientName, iLifetimeScope); + }); + } + else + { + services.AddSingleton(sp => + { + var rabbitMQPersistentConnection = sp.GetRequiredService(); + var iLifetimeScope = sp.GetRequiredService(); + var logger = sp.GetRequiredService>(); + var eventBusSubcriptionsManager = sp.GetRequiredService(); + + var retryCount = 5; + if (!string.IsNullOrEmpty(configuration["EventBusRetryCount"])) + { + retryCount = int.Parse(configuration["EventBusRetryCount"]); + } + + return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount); + }); + } + + services.AddSingleton(); + + return services; + } + + public static IServiceCollection RegisterHostedServices(this IServiceCollection services) + { + services.AddSingleton(); + + return services; + } + } + +} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs new file mode 100644 index 000000000..e9b56aece --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/Base/BackgroundTask.cs @@ -0,0 +1,81 @@ +using Microsoft.Extensions.Hosting; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Ordering.BackgroundTasksHost.Tasks.Base +{ + // Copyright(c) .NET Foundation.All rights reserved. + // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + + /// + /// Base class for implementing a long running . + /// IMPORTANT: This base class is implemented in .NET Core 2.1 - Since this microservice is still in .NET Core 2.0, we're using the class within the project + /// When .NET Core 2.1 is released, this class should be removed and you should use the use implemented by the framework + /// https://github.com/aspnet/Hosting/blob/712c992ca827576c05923e6a134ca0bec87af4df/src/Microsoft.Extensions.Hosting.Abstractions/BackgroundService.cs + /// + /// + public abstract class BackgroundService : IHostedService, IDisposable + { + private Task _executingTask; + + private readonly CancellationTokenSource _stoppingCts = new CancellationTokenSource(); + + /// + /// This method is called when the starts. The implementation should return a task that represents + /// the lifetime of the long running operation(s) being performed. + /// + /// Triggered when is called. + /// A that represents the long running operations. + protected abstract Task ExecuteAsync(CancellationToken stoppingToken); + + /// + /// Triggered when the application host is ready to start the service. + /// + /// Indicates that the start process has been aborted. + public virtual Task StartAsync(CancellationToken cancellationToken) + { + // Store the task we're executing + _executingTask = ExecuteAsync(_stoppingCts.Token); + + // If the task is completed then return it, this will bubble cancellation and failure to the caller + if (_executingTask.IsCompleted) + { + return _executingTask; + } + + // Otherwise it's running + return Task.CompletedTask; + } + + /// + /// Triggered when the application host is performing a graceful shutdown. + /// + /// Indicates that the shutdown process should no longer be graceful. + public virtual async Task StopAsync(CancellationToken cancellationToken) + { + // Stop called without start + if (_executingTask == null) + { + return; + } + + try + { + // Signal cancellation to the executing method + _stoppingCts.Cancel(); + } + finally + { + // Wait until the task completes or the stop token triggers + await Task.WhenAny(_executingTask, Task.Delay(Timeout.Infinite, cancellationToken)); + } + + } + + public virtual void Dispose() + { + _stoppingCts.Cancel(); + } + } +} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs b/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs new file mode 100644 index 000000000..d25e58b32 --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/Tasks/GracePeriodManagerTask.cs @@ -0,0 +1,92 @@ +using Dapper; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Ordering.BackgroundTasksHost.Configuration; +using Ordering.BackgroundTasksHost.IntegrationEvents; +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Threading; +using System.Threading.Tasks; + +namespace Ordering.BackgroundTasksHost.Tasks +{ + public class GracePeriodManagerService + : BackgroundService + { + private readonly ILogger _logger; + private readonly BackgroundTaskSettings _settings; + private readonly IEventBus _eventBus; + + public GracePeriodManagerService(IOptions settings, + IEventBus eventBus, + ILogger logger) + { + _settings = settings?.Value ?? throw new ArgumentNullException(nameof(settings)); + _eventBus = eventBus ?? throw new ArgumentNullException(nameof(eventBus)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + _logger.LogDebug($"GracePeriodManagerService is starting."); + + //stoppingToken.Register(() => _logger.LogDebug($"#1 GracePeriodManagerService background task is stopping.")); + + //while (!stoppingToken.IsCancellationRequested) + //{ + // _logger.LogDebug($"GracePeriodManagerService background task is doing background work."); + + // CheckConfirmedGracePeriodOrders(); + + // await Task.Delay(_settings.CheckUpdateTime, stoppingToken); + //} + + _logger.LogDebug($"GracePeriodManagerService background task is stopping."); + + await Task.CompletedTask; + } + + private void CheckConfirmedGracePeriodOrders() + { + _logger.LogDebug($"Checking confirmed grace period orders"); + + var orderIds = GetConfirmedGracePeriodOrders(); + + foreach (var orderId in orderIds) + { + var confirmGracePeriodEvent = new GracePeriodConfirmedIntegrationEvent(orderId); + + _eventBus.Publish(confirmGracePeriodEvent); + } + } + + private IEnumerable GetConfirmedGracePeriodOrders() + { + IEnumerable orderIds = new List(); + + using (var conn = new SqlConnection(_settings.ConnectionString)) + { + try + { + conn.Open(); + orderIds = conn.Query( + @"SELECT Id FROM [ordering].[orders] + WHERE DATEDIFF(minute, [OrderDate], GETDATE()) >= @GracePeriodTime + AND [OrderStatusId] = 1", + new { GracePeriodTime = _settings.GracePeriodTime }); + } + catch (SqlException exception) + { + _logger.LogCritical($"FATAL ERROR: Database connections could not be opened: {exception.Message}"); + } + + } + + return orderIds; + } + } +} diff --git a/src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json b/src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json new file mode 100644 index 000000000..fd26645ab --- /dev/null +++ b/src/Services/Ordering/Ordering.BackgroundTasksHost/appsettings.json @@ -0,0 +1,27 @@ +{ + "ConnectionString": "Server=tcp:127.0.0.1,5433;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word;", + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Debug" + } + }, + "Console": { + "LogLevel": { + "Default": "Debug" + } + } + }, + "SubscriptionClientName": "BackgroundTasks", + "GracePeriodTime": "1", + "CheckUpdateTime": "1000", + "ApplicationInsights": { + "InstrumentationKey": "" + }, + "AzureServiceBusEnabled": false, + "EventBusRetryCount": 5, + "EventBusConnection": "", + "EventBusUserName": "", + "EventBusPassword": "" +} \ No newline at end of file