protected override async Task <JobResult> RunInternalAsync(CancellationToken token) { var ip = Util.GetExternalIP(); if (ip != null) { Log.Info().Message("Public IP:" + ip).Write(); } CopyCollections("error", "errorstack", "errorstack.stats.day", "errorstack.stats.month", "jobhistory", "joblock", "log", "project.stats.day", "project.stats.month"); Log.Info().Message("Running migrations...").Write(); MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, new MongoUrl(Settings.Current.MongoConnectionString).DatabaseName); Log.Info().Message("Finished running migrations").Write(); Log.Info().Message("Creating indexes...").Write(); new ApplicationRepository(_mongoDatabase); new OrganizationRepository(_mongoDatabase); new ProjectRepository(_mongoDatabase); new TokenRepository(_mongoDatabase); new WebHookRepository(_mongoDatabase); new UserRepository(_mongoDatabase); Log.Info().Message("Finished creating indexes...").Write(); Log.Info().Message("Flushing redis cache").Write(); _cacheClient.FlushAll(); return(JobResult.Success); }
public SystemHealthCheckerTests() { if (Settings.Current.ShouldAutoUpgradeDatabase) { MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, Settings.Current.MongoDatabaseName); } }
public static bool IsDbUpToDate() { lock (_dbIsUpToDateLock) { if (_dbIsUpToDate.HasValue && (_dbIsUpToDate.Value || DateTime.Now.Subtract(_lastDbUpToDateCheck).TotalSeconds < 10)) { return(_dbIsUpToDate.Value); } _lastDbUpToDateCheck = DateTime.Now; _dbIsUpToDate = MongoMigrationChecker.IsUpToDate(Settings.Current.MongoConnectionString, Settings.Current.MongoDatabaseName); return(_dbIsUpToDate.Value); } }
public static bool IsDbUpToDate() { lock (_dbIsUpToDateLock) { if (_dbIsUpToDate.HasValue && (_dbIsUpToDate.Value || DateTime.Now.Subtract(_lastDbUpToDateCheck).TotalSeconds > 10)) { return(_dbIsUpToDate.Value); } _lastDbUpToDateCheck = DateTime.Now; string connectionString = ConfigurationManager.ConnectionStrings["MongoConnectionString"].ConnectionString; if (String.IsNullOrEmpty(connectionString)) { throw new ConfigurationErrorsException("MongoConnectionString was not found in the Web.config."); } var url = new MongoUrl(connectionString); string databaseName = url.DatabaseName; if (Settings.Current.AppendMachineNameToDatabase) { databaseName += String.Concat("-", Environment.MachineName.ToLower()); } try { _dbIsUpToDate = MongoMigrationChecker.IsUpToDate(connectionString, databaseName); } catch (Exception e) { Log.Error().Exception(e).Message("Error checking db version: {0}", e.Message).Report().Write(); } if (!_dbIsUpToDate.HasValue || !_dbIsUpToDate.Value) { // if enabled, auto upgrade the database if (Settings.Current.ShouldAutoUpgradeDatabase) { try { MongoMigrationChecker.EnsureLatest(connectionString, databaseName); } catch (Exception e) { Log.Error().Exception(e).Message("Error ensuring latest db version: {0}", e.Message).Report().Write(); } _dbIsUpToDate = true; return(true); } return(false); } return(true); } }
private static Container CreateContainer() { var container = AppBuilder.CreateContainer(false); RegisterServices(container); var searchclient = container.GetInstance <IElasticClient>(); searchclient.DeleteIndex(i => i.AllIndices()); if (Settings.Current.ShouldAutoUpgradeDatabase) { MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, Settings.Current.MongoDatabaseName); } return(container); }
public static bool IsDbUpToDate() { lock (_dbIsUpToDateLock) { if (_dbIsUpToDate.HasValue && (_dbIsUpToDate.Value || DateTime.Now.Subtract(_lastDbUpToDateCheck).TotalSeconds < 10)) { return(_dbIsUpToDate.Value); } _lastDbUpToDateCheck = DateTime.Now; string connectionString = ConfigurationManager.ConnectionStrings["MongoConnectionString"].ConnectionString; if (String.IsNullOrEmpty(connectionString)) { throw new ConfigurationErrorsException("MongoConnectionString was not found in the Web.config."); } var url = new MongoUrl(connectionString); string databaseName = url.DatabaseName; if (Settings.Current.AppendMachineNameToDatabase) { databaseName += String.Concat("-", Environment.MachineName.ToLower()); } _dbIsUpToDate = MongoMigrationChecker.IsUpToDate(connectionString, databaseName); if (_dbIsUpToDate.Value) { return(true); } // if enabled, auto upgrade the database if (Settings.Current.ShouldAutoUpgradeDatabase) { Task.Factory.StartNew(() => MongoMigrationChecker.EnsureLatest(connectionString, databaseName)) .ContinueWith(_ => { _dbIsUpToDate = false; }); } return(false); } }
public static bool IsDbUpToDate() { lock (_dbIsUpToDateLock) { if (_dbIsUpToDate.HasValue && (_dbIsUpToDate.Value || DateTime.Now.Subtract(_lastDbUpToDateCheck).TotalSeconds < 10)) { return(_dbIsUpToDate.Value); } _lastDbUpToDateCheck = DateTime.Now; var url = new MongoUrl(Settings.Current.MongoConnectionString); string databaseName = url.DatabaseName; if (Settings.Current.AppendMachineNameToDatabase) { databaseName += String.Concat("-", Environment.MachineName.ToLower()); } _dbIsUpToDate = MongoMigrationChecker.IsUpToDate(Settings.Current.MongoConnectionString, databaseName); return(_dbIsUpToDate.Value); } }
public static void BuildWithContainer(IAppBuilder app, Container container) { if (container == null) { throw new ArgumentNullException("container"); } Config = new HttpConfiguration(); ExceptionlessClient.Default.RegisterWebApi(Config); Log.Info().Message("Starting api...").Write(); // if enabled, auto upgrade the database if (Settings.Current.ShouldAutoUpgradeDatabase) { var url = new MongoUrl(Settings.Current.MongoConnectionString); string databaseName = url.DatabaseName; if (Settings.Current.AppendMachineNameToDatabase) { databaseName += String.Concat("-", Environment.MachineName.ToLower()); } MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, databaseName); } Config.Services.Add(typeof(IExceptionLogger), new NLogExceptionLogger()); Config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); Config.Formatters.Remove(Config.Formatters.XmlFormatter); Config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented; Config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new LowerCaseUnderscorePropertyNamesContractResolver(); var constraintResolver = new DefaultInlineConstraintResolver(); constraintResolver.ConstraintMap.Add("objectid", typeof(ObjectIdRouteConstraint)); constraintResolver.ConstraintMap.Add("objectids", typeof(ObjectIdsRouteConstraint)); constraintResolver.ConstraintMap.Add("token", typeof(TokenRouteConstraint)); constraintResolver.ConstraintMap.Add("tokens", typeof(TokensRouteConstraint)); Config.MapHttpAttributeRoutes(constraintResolver); //Config.EnableSystemDiagnosticsTracing(); container.RegisterSingle <JsonSerializer>(JsonSerializer.Create(new JsonSerializerSettings { ContractResolver = new SignalRContractResolver() })); container.RegisterWebApiFilterProvider(Config); try { container.Verify(); } catch (Exception ex) { var tempEx = ex; while (!(tempEx is ReflectionTypeLoadException)) { if (tempEx.InnerException == null) { break; } tempEx = tempEx.InnerException; } var typeLoadException = tempEx as ReflectionTypeLoadException; if (typeLoadException != null) { foreach (var loaderEx in typeLoadException.LoaderExceptions) { Debug.WriteLine(loaderEx.Message); } } Debug.WriteLine(ex.Message); throw; } Config.MessageHandlers.Add(container.GetInstance <XHttpMethodOverrideDelegatingHandler>()); Config.MessageHandlers.Add(container.GetInstance <EncodingDelegatingHandler>()); Config.MessageHandlers.Add(container.GetInstance <AuthMessageHandler>()); // Throttle api calls to X every 15 minutes by IP address. Config.MessageHandlers.Add(container.GetInstance <ThrottlingHandler>()); // Reject event posts in orgs over their max event limits. Config.MessageHandlers.Add(container.GetInstance <OverageHandler>()); app.UseCors(new CorsOptions { PolicyProvider = new CorsPolicyProvider { PolicyResolver = ctx => Task.FromResult(new CorsPolicy { AllowAnyHeader = true, AllowAnyMethod = true, AllowAnyOrigin = true, SupportsCredentials = true, PreflightMaxAge = 60 * 5 }) } }); app.CreatePerContext <Lazy <User> >("User", ctx => new Lazy <User>(() => { if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated) { return(null); } string userId = ctx.Request.User.GetUserId(); if (String.IsNullOrEmpty(userId)) { return(null); } var userRepository = container.GetInstance <IUserRepository>(); return(userRepository.GetById(userId, true)); })); app.CreatePerContext <Lazy <Project> >("DefaultProject", ctx => new Lazy <Project>(() => { if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated) { return(null); } // TODO: Use project id from url. E.G., /projects/{projectId:objectid}/events string projectId = ctx.Request.User.GetDefaultProjectId(); var projectRepository = container.GetInstance <IProjectRepository>(); if (String.IsNullOrEmpty(projectId)) { var firstOrgId = ctx.Request.User.GetOrganizationIds().FirstOrDefault(); if (!String.IsNullOrEmpty(firstOrgId)) { var project = projectRepository.GetByOrganizationId(firstOrgId, useCache: true).FirstOrDefault(); if (project != null) { return(project); } } if (Settings.Current.WebsiteMode == WebsiteMode.Dev) { var dataHelper = container.GetInstance <DataHelper>(); // create a default org and project projectId = dataHelper.CreateDefaultOrganizationAndProject(ctx.Request.GetUser()); } } if (String.IsNullOrEmpty(projectId)) { return(null); } return(projectRepository.GetById(projectId, true)); })); app.UseWebApi(Config); var resolver = new SimpleInjectorSignalRDependencyResolver(container); if (Settings.Current.EnableRedis) { resolver.UseRedis(new RedisScaleoutConfiguration(Settings.Current.RedisConnectionString, "exceptionless.signalr")); } app.MapSignalR("/api/v2/push", new HubConfiguration { Resolver = resolver }); Mapper.Configuration.ConstructServicesUsing(container.GetInstance); var context = new OwinContext(app.Properties); var token = context.Get <CancellationToken>("host.OnAppDisposing"); CreateSampleData(container); if (Settings.Current.RunJobsInProcess) { Task.Factory.StartNew(() => container.GetInstance <EventPostsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <EventUserDescriptionsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <MailMessageJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <EventNotificationsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <WebHooksJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<DailySummaryJob>().RunContinuousAsync(delay: TimeSpan.FromMinutes(15), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<RetentionLimitsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<StaleAccountsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); } }
public static void BuildWithContainer(IAppBuilder app, Container container, bool registerExceptionlessClient = true) { if (container == null) { throw new ArgumentNullException("container"); } // if enabled, auto upgrade the database if (Settings.Current.ShouldAutoUpgradeDatabase) { var url = new MongoUrl(Settings.Current.MongoConnectionString); string databaseName = url.DatabaseName; if (Settings.Current.AppendMachineNameToDatabase) { databaseName += String.Concat("-", Environment.MachineName.ToLower()); } MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, databaseName); } Config = new HttpConfiguration(); Config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); Config.Formatters.Remove(Config.Formatters.XmlFormatter); Config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented; Config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new LowerCaseUnderscorePropertyNamesContractResolver(); var constraintResolver = new DefaultInlineConstraintResolver(); constraintResolver.ConstraintMap.Add("objectid", typeof(ObjectIdRouteConstraint)); constraintResolver.ConstraintMap.Add("objectids", typeof(ObjectIdsRouteConstraint)); Config.MapHttpAttributeRoutes(constraintResolver); //config.EnableSystemDiagnosticsTracing(); container.RegisterSingle <JsonSerializer>(JsonSerializer.Create(new JsonSerializerSettings { ContractResolver = new SignalRContractResolver() })); container.RegisterWebApiFilterProvider(Config); try { container.Verify(); } catch (Exception ex) { var tempEx = ex; while (!(tempEx is ReflectionTypeLoadException)) { if (tempEx.InnerException == null) { break; } tempEx = tempEx.InnerException; } var typeLoadException = tempEx as ReflectionTypeLoadException; if (typeLoadException != null) { foreach (var loaderEx in typeLoadException.LoaderExceptions) { Debug.WriteLine(loaderEx.Message); } } Debug.WriteLine(ex.Message); throw; } Config.MessageHandlers.Add(container.GetInstance <XHttpMethodOverrideDelegatingHandler>()); Config.MessageHandlers.Add(container.GetInstance <EncodingDelegatingHandler>()); Config.MessageHandlers.Add(container.GetInstance <AuthTokenMessageHandler>()); // Throttle api calls to X every 15 minutes by IP address. Config.MessageHandlers.Add(container.GetInstance <ThrottlingHandler>()); // Reject event posts in orgs over their max event limits. Config.MessageHandlers.Add(container.GetInstance <OverageHandler>()); app.UseCors(CorsOptions.AllowAll); app.CreatePerContext <Lazy <User> >("User", ctx => new Lazy <User>(() => { if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated) { return(null); } string userId = ctx.Request.User.GetUserId(); if (String.IsNullOrEmpty(userId)) { return(null); } var userRepository = container.GetInstance <IUserRepository>(); return(userRepository.GetById(userId, true)); })); app.CreatePerContext <Lazy <Project> >("DefaultProject", ctx => new Lazy <Project>(() => { if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated) { return(null); } string projectId = ctx.Request.User.GetDefaultProjectId(); var projectRepository = container.GetInstance <IProjectRepository>(); if (String.IsNullOrEmpty(projectId)) { return(projectRepository.GetByOrganizationIds(ctx.Request.User.GetOrganizationIds(), useCache: true).FirstOrDefault()); } return(projectRepository.GetById(projectId, true)); })); if (registerExceptionlessClient) { ExceptionlessClient.Default.RegisterWebApi(Config); Config.Services.Add(typeof(IExceptionLogger), new ExceptionlessExceptionLogger()); } app.UseWebApi(Config); app.MapSignalR("/api/v2/push", new HubConfiguration { Resolver = new SimpleInjectorSignalRDependencyResolver(container) }); PhysicalFileSystem fileSystem = null; var root = AppDomain.CurrentDomain.BaseDirectory; if (Directory.Exists(Path.Combine(root, "./Content"))) { fileSystem = new PhysicalFileSystem(Path.Combine(root, "./Content")); } if (Directory.Exists(Path.Combine(root, "./bin/Content"))) { fileSystem = new PhysicalFileSystem(Path.Combine(root, "./bin/Content")); } if (fileSystem != null) { app.UseFileServer(new FileServerOptions { FileSystem = fileSystem }); } Mapper.Configuration.ConstructServicesUsing(container.GetInstance); // TODO: Figure out what data we want to create when the db is empty in production mode. if (Settings.Current.WebsiteMode == WebsiteMode.Dev) { EnsureSampleData(container); } var context = new OwinContext(app.Properties); var token = context.Get <CancellationToken>("host.OnAppDisposing"); if (Settings.Current.EnableJobsModule) { Run.InBackground(t => container.GetInstance <ProcessEventPostsJob>().Run(token), token); Run.InBackground(t => container.GetInstance <ProcessEventUserDescriptionsJob>().Run(token), token); Run.InBackground(t => container.GetInstance <ProcessMailMessageJob>().Run(token), token); Run.InBackground(t => container.GetInstance <DailyNotificationJob>().Run(token), token); Run.InBackground(t => container.GetInstance <EnforceRetentionLimitsJob>().Run(token), token); Run.InBackground(t => container.GetInstance <RemoveStaleAccountsJob>().Run(token), token); } }
public static void BuildWithContainer(IAppBuilder app, Container container) { if (container == null) { throw new ArgumentNullException("container"); } if (Settings.Current.ShouldAutoUpgradeDatabase) { MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, Settings.Current.MongoDatabaseName); } Config = new HttpConfiguration(); Config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); Config.Formatters.Remove(Config.Formatters.XmlFormatter); Config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented; Config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = container.GetInstance <IContractResolver>(); var constraintResolver = new DefaultInlineConstraintResolver(); constraintResolver.ConstraintMap.Add("objectid", typeof(ObjectIdRouteConstraint)); constraintResolver.ConstraintMap.Add("objectids", typeof(ObjectIdsRouteConstraint)); constraintResolver.ConstraintMap.Add("token", typeof(TokenRouteConstraint)); constraintResolver.ConstraintMap.Add("tokens", typeof(TokensRouteConstraint)); Config.MapHttpAttributeRoutes(constraintResolver); container.RegisterWebApiFilterProvider(Config); VerifyContainer(container); container.Bootstrap(Config); container.Bootstrap(app); Log.Info().Message("Starting api...").Write(); Config.Services.Add(typeof(IExceptionLogger), new NLogExceptionLogger()); Config.Services.Replace(typeof(IExceptionHandler), container.GetInstance <ExceptionlessReferenceIdExceptionHandler>()); Config.MessageHandlers.Add(container.GetInstance <XHttpMethodOverrideDelegatingHandler>()); Config.MessageHandlers.Add(container.GetInstance <EncodingDelegatingHandler>()); Config.MessageHandlers.Add(container.GetInstance <AuthMessageHandler>()); // Throttle api calls to X every 15 minutes by IP address. Config.MessageHandlers.Add(container.GetInstance <ThrottlingHandler>()); // Reject event posts in orgs over their max event limits. Config.MessageHandlers.Add(container.GetInstance <OverageHandler>()); app.UseCors(new CorsOptions { PolicyProvider = new CorsPolicyProvider { PolicyResolver = ctx => Task.FromResult(new CorsPolicy { AllowAnyHeader = true, AllowAnyMethod = true, AllowAnyOrigin = true, SupportsCredentials = true, PreflightMaxAge = 60 * 5 }) } }); app.CreatePerContext <Lazy <User> >("User", ctx => new Lazy <User>(() => { if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated) { return(null); } string userId = ctx.Request.User.GetUserId(); if (String.IsNullOrEmpty(userId)) { return(null); } var userRepository = container.GetInstance <IUserRepository>(); return(userRepository.GetById(userId, true)); })); app.CreatePerContext <Lazy <Project> >("DefaultProject", ctx => new Lazy <Project>(() => { if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated) { return(null); } // TODO: Use project id from url. E.G., /projects/{projectId:objectid}/events string projectId = ctx.Request.User.GetDefaultProjectId(); var projectRepository = container.GetInstance <IProjectRepository>(); if (String.IsNullOrEmpty(projectId)) { var firstOrgId = ctx.Request.User.GetOrganizationIds().FirstOrDefault(); if (!String.IsNullOrEmpty(firstOrgId)) { var project = projectRepository.GetByOrganizationId(firstOrgId, useCache: true).FirstOrDefault(); if (project != null) { return(project); } } if (Settings.Current.WebsiteMode == WebsiteMode.Dev) { var dataHelper = container.GetInstance <DataHelper>(); // create a default org and project projectId = dataHelper.CreateDefaultOrganizationAndProject(ctx.Request.GetUser()); } } if (String.IsNullOrEmpty(projectId)) { return(null); } return(projectRepository.GetById(projectId, true)); })); app.UseWebApi(Config); var resolver = new SimpleInjectorSignalRDependencyResolver(container); if (Settings.Current.EnableRedis) { resolver.UseRedis(new RedisScaleoutConfiguration(Settings.Current.RedisConnectionString, "exceptionless.signalr")); } app.MapSignalR("/api/v2/push", new HubConfiguration { Resolver = resolver }); Config.EnableSwagger("schema/{apiVersion}", c => { c.SingleApiVersion("v2", "Exceptionless"); c.ApiKey("access_token").In("header").Name("access_token").Description("API Key Authentication"); c.BasicAuth("basic").Description("Basic HTTP Authentication"); c.IncludeXmlComments(String.Format(@"{0}\bin\Exceptionless.Api.xml", AppDomain.CurrentDomain.BaseDirectory)); c.IgnoreObsoleteActions(); c.DocumentFilter <FilterRoutesDocumentFilter>(); }).EnableSwaggerUi("docs/{*assetPath}", c => { c.InjectStylesheet(typeof(AppBuilder).Assembly, "Exceptionless.Api.Content.docs.css"); c.InjectJavaScript(typeof(AppBuilder).Assembly, "Exceptionless.Api.Content.docs.js"); }); Mapper.Configuration.ConstructServicesUsing(container.GetInstance); var context = new OwinContext(app.Properties); var token = context.Get <CancellationToken>("host.OnAppDisposing"); CreateSampleData(container); if (Settings.Current.RunJobsInProcess) { Task.Factory.StartNew(() => container.GetInstance <EventPostsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <EventUserDescriptionsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <MailMessageJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <EventNotificationsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <WebHooksJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<DailySummaryJob>().RunContinuousAsync(delay: TimeSpan.FromMinutes(15), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<RetentionLimitsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<StaleAccountsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); } }