/// <summary>
        /// Set up the jobs particular to this application
        /// </summary>
        private static void ConfigureScheduledBackgroundJobs()
        {
            var recurringJobIds = new List <string>();

            // because the reminder configurations are tenant-specific and user-configurable, just schedule the job to run nightly and have it check whether it's time to send a remind for each tenant.
            AddRecurringJob(ProjectUpdateReminderScheduledBackgroundJob.JobName,
                            () => ScheduledBackgroundJobLaunchHelper.RunProjectUpdateKickoffReminderScheduledBackgroundJob(),
                            MakeDailyUtcCronJobStringFromLocalTime(1, 23),
                            recurringJobIds);

            // Clean up stale FirmaSessions
            AddRecurringJob(CleanUpStaleFirmaSessionsJob.JobName,
                            () => ScheduledBackgroundJobLaunchHelper.RunCleanUpStaleFirmaSessionsScheduledBackgroundJob(),
                            Cron.Hourly(10),
                            recurringJobIds);

            // Remove any jobs we haven't explicitly scheduled
            RemoveExtraneousJobs(recurringJobIds);
        }
Example #2
0
        /*
         * /// <summary>
         * /// Set up the jobs particular to this application
         * /// </summary>
         * private static void ConfigureScheduledBackgroundJobs()
         * {
         *  var recurringJobIds = new List<string>();
         *
         *  // WADNR has the luxury of not worrying about tenant.
         *  // because the reminder configurations are tenant-specific and user-configurable, just schedule the job to run nightly and have it check whether it's time to send a remind for each tenant.
         *
         *  // Right now this job crashes, and we don't need it. Also, I can't get to Hangfire dashboard with /hangfire.
         *  // Ray suggests re-porting our Hangfire work from Gemini which doesn't auto-restore database and fire off jobs, so we may want to
         *  // just re-port all of Gemini Hangfire rather than debug what's here in Wadnr/Firma already. -- SLG 2/19/2019
         *
         *  AddRecurringJob(ProjectUpdateReminderScheduledBackgroundJob.JobName,
         *      () => ScheduledBackgroundJobLaunchHelper.RunProjectUpdateKickoffReminderScheduledBackgroundJob(),
         *      MakeDailyUtcCronJobStringFromLocalTime(1,23),
         *      recurringJobIds);
         *
         *  // Remove any jobs we haven't explicitly scheduled
         *  RemoveExtraneousJobs(recurringJobIds);
         * }
         */

        /// <summary>
        /// Set up the jobs particular to this application
        /// </summary>
        private static void ConfigureScheduledBackgroundJobs()
        {
            // Note that tasks here all have staggered start times - for example, all the hourly jobs start at 2, 4, 6, etc. minutes after the hour. This is to give the schedule a more
            // predictable flow, rather than starting random, less predictable traffic jams.
            var recurringJobIds = new List <string>();

            const int runJobEveryFifteenMinutes = 15;

            // Every 15 minutes jobs
            var cronValueFor15Minutes = CronValueOrNeverIfJobsDisabled($"*/{runJobEveryFifteenMinutes} * * * *");

            AddRecurringJob(VendorImportHangfireBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunVendorImportScheduledBackgroundJob(JobCancellationToken.Null), cronValueFor15Minutes, recurringJobIds);
            AddRecurringJob(GrantExpenditureImportHangfireBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunGrantExpenditureImportScheduledBackgroundJob(JobCancellationToken.Null), cronValueFor15Minutes, recurringJobIds);
            AddRecurringJob(ProjectCodeImportHangfireBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunProjectCodeImportScheduledBackgroundJob(JobCancellationToken.Null), cronValueFor15Minutes, recurringJobIds);

            // We only add this job if we are beyond this date, so that can get to phase 2 without this job screaming at us.
            // This job (and likely others) needs a proper merge function, but we have no budget for this currently. -- SLG 7/9/2019
            const int yearToRestartProgramIndex     = 2019;
            const int monthToRestartProgramIndex    = 10;
            const int dayToRestartProgramIndex      = 1;
            const int hourToRestartProgramIndex     = 11;
            var       dateTimeToRestartProgramIndex = new DateTime(yearToRestartProgramIndex, monthToRestartProgramIndex, dayToRestartProgramIndex, hourToRestartProgramIndex, 0, 0);

            if (DateTime.Now >= dateTimeToRestartProgramIndex)
            {
                AddRecurringJob(ProgramIndexImportHangfireBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunProgramIndexImportScheduledBackgroundJob(JobCancellationToken.Null), cronValueFor15Minutes, recurringJobIds);
            }

            // 1:30 AM tasks
            //var oneThirtyAmCronString = MakeDailyCronJobStringFromLocalTime(1, 36);


            // See ConfigureScheduledBackgroundJobs in Gemini for further examples of how to schedule things at various time intervals.
            // Commented out examples below.

            /*
             * AddRecurringJob(WorkflowNotificationsScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunWorkflowNotificationsScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(Cron.Hourly(2)), recurringJobIds);
             * AddRecurringJob(ChangeRequestMeetingScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunChangeRequestMeetingScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(Cron.Hourly(4)), recurringJobIds);
             * AddRecurringJob(TaurusSessionDeletedExpiredScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunTaurusSessionDeletedExpiredScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(Cron.Hourly(6)), recurringJobIds);
             * AddRecurringJob(SnapshotPortfolioReviewBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunSnapshotPortfolioReviewBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(Cron.Hourly(8)), recurringJobIds);
             *
             * // 11:00~ish PM tasks
             * AddRecurringJob(BudgetStartOfYearSendDigestNotificationBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunBudgetStartOfYearSendDigestNotificationBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(23, 00)), recurringJobIds);
             * AddRecurringJob(ProjectSendDigestNotificationTaurusBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunProjectSendDigestNotificationTaurusBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(23, 05)), recurringJobIds);
             */


            //// 12:05 am tasks
            //// This job takes a while ideally it will be done before the Aries ETL processes.
            //// Also we don't want it to run during the 11:30pm time because that's when there's a nightly web site reset.
            //AddRecurringJob(IdentifyXYScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunIdentifyXYScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(00, 05)), recurringJobIds);

            //// 1:30~ish AM tasks
            //AddRecurringJob(SessionCleanupScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunSessionCleanupScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(1, 36)), recurringJobIds);

            //// 2:00~ish AM tasks
            //AddRecurringJob(UpdateMonitoringResourcesWebReferencePaths.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunUpdateMonitoringResourcesWebReferencePaths(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(2, 03)), recurringJobIds);
            //AddRecurringJob(CleanUpOgr2OgrFilesAndDatabaseTables.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunCleanUpOgr2OgrFilesAndDatabaseTables(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(2, 10)), recurringJobIds);

            //// 4:30~ish AM tasks
            //AddRecurringJob(FireRemindersScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunFireRemindersScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(4, 30)), recurringJobIds);
            //AddRecurringJob(AccrualObligationsScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunAccrualObligationsScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(4, 35)), recurringJobIds);
            //AddRecurringJob(StatusReportStatisticsScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunStatusReportStatisticsScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(4, 40)), recurringJobIds);
            //AddRecurringJob(AutoSetTaskStatusScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunAutoSetTaskStatusScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(4, 45)), recurringJobIds);

            //// 6:00~ish AM tasks
            //AddRecurringJob(DeleteOldPortfolioCacheRecordsScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunDeleteOldPortfolioCacheRecordsScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(5, 55)), recurringJobIds);
            //AddRecurringJob(MailDataQualityAdminScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunMailDataQualityAdminScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(6, 00)), recurringJobIds);
            //AddRecurringJob(UpdatePortfolioCacheTaurusBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunUpdatePortfolioCacheTaurusBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(6, 05)), recurringJobIds);
            //AddRecurringJob(CostSharePlanReminderEmailBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunCostSharePlanReminderEmailBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringFromLocalTime(6, 30)), recurringJobIds);

            //// every 5 minutes jobs
            //AddRecurringJob(UpdateDocumentIndexScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunUpdateDocumentIndexScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled("*/5 * * * *"), recurringJobIds);
            //AddRecurringJob(NotifyAboutNewUserAgentsThatMightBeUnwantedBots.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunNotifyAboutNewUserAgentsThatMightBeUnwantedBotsBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled("*/5 * * * *"), recurringJobIds);

            //// every 15 minutes jobs
            //AddRecurringJob(VirusScanScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunVirusScanScheduledBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled($"*/{VirusScanScheduledBackgroundJob.RunJobEveryNMinutes} * * * *"), recurringJobIds);
            //AddRecurringJob(GenerateFilesForDownloadScheduledBackgroundJob.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunGenerateFilesForDownloadScheduledBackgroundJobBackgroundJob(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled("*/15 * * * *"), recurringJobIds);


            //// every 2 hour jobs
            //AddRecurringJob(UpdateMonitoringResourcesCache.Instance.JobName, () => ScheduledBackgroundJobLaunchHelper.RunUpdateMonitoringResourcesCache(JobCancellationToken.Null), CronValueOrNeverIfJobsDisabled(MakeDailyCronJobStringForMinuteWithOffset(11, 120)), recurringJobIds);

            // Remove any jobs we haven't explicitly scheduled above
            RemoveExtraneousJobs(recurringJobIds);
        }