/// <summary> /// /// </summary> /// <param name="jobInstanceId"></param> /// <returns>Returns null if a "sync object" no longer exists.</returns> public JobInstance GetJobInstanceFromQueueLog(Guid jobInstanceId, bool throwExceptionIfSyncObjectsAreDeletedOrDisabled = false) { if (!JobQueueManager.IsSafeForQueueLogRetrieval) { throw new Exception("The Job Queue Manager is in an unsafe state as job statuses may change. Queue retrieval from the database is disallowed."); } var configurator = new SyncEngineDatabaseConfigurator(_connectionString); using (var dbContext = new ls.QueueManagementDataContext(_connectionString)) { var jobInstanceInDbQueue = dbContext.JobQueues.Where(d => d.JobInstanceId == jobInstanceId).FirstOrDefault(); var integration = configurator.GetIntegrationByJobId(jobInstanceInDbQueue.JobId); if (integration == null || !integration.IsEnabled) { goto SyncObjectsForJobInstanceHaveChanged; } var job = integration.Jobs.Where(d => d.Id == jobInstanceInDbQueue.JobId).FirstOrDefault(); if (job == null || !job.IsEnabled) { goto SyncObjectsForJobInstanceHaveChanged; } var sourceDataSource = job.SourceDataSources.Values.Where(d => d.Id == jobInstanceInDbQueue.SourceDataSourceId).FirstOrDefault(); if (sourceDataSource == null) { goto SyncObjectsForJobInstanceHaveChanged; } if (job.TargetDataSource.Id != jobInstanceInDbQueue.TargetDataSourceId) { goto SyncObjectsForJobInstanceHaveChanged; } var jobStepInstancesInDbQueue = dbContext.JobStepQueues.Where(d => d.JobInstanceId == jobInstanceInDbQueue.JobInstanceId).ToList(); if (jobStepInstancesInDbQueue.Count == 0) { goto SyncObjectsForJobInstanceHaveChanged; } List <JobStepInstance> jobStepInstanceObjs = new List <JobStepInstance>(); foreach (var jobStepInstanceInDbQueue in jobStepInstancesInDbQueue) { var jobStep = job.Steps.Where(d => d.Id == jobStepInstanceInDbQueue.JobStepId).FirstOrDefault(); if (jobStep == null || !jobStep.IsEnabled) { goto SyncObjectsForJobInstanceHaveChanged; } var jobStepInstanceObj = new JobStepInstance(jobStepInstanceInDbQueue.JobStepInstanceId, jobStep, jobStepInstanceInDbQueue.OrderIndex); jobStepInstanceObj.Status = (JobStepQueueStatus)jobStepInstanceInDbQueue.JobStepQueueStatusId; jobStepInstanceObjs.Add(jobStepInstanceObj); } var filters = JobFilterHelper.ParseFromDatabaseText(jobInstanceInDbQueue.Filters); var invocationSourceType = jobInstanceInDbQueue.IsOnDemand == true ? JobInvocationSourceType.OnDemand : JobInvocationSourceType.Scheduled; var queueRequest = new JobQueueRequest(jobInstanceInDbQueue.QueueRequestId, integration, job, invocationSourceType); var jobInstanceObj = new JobInstance(queueRequest, jobInstanceInDbQueue.JobInstanceId, integration, job, sourceDataSource, job.TargetDataSource, jobStepInstanceObjs, jobInstanceInDbQueue.ScheduledStartTime, jobInstanceInDbQueue.InvocationSource, invocationSourceType, filters.ToList()); queueRequest.JobInstances.Add(jobInstanceObj); jobInstanceObj.Status = (JobQueueStatus)jobInstanceInDbQueue.JobQueueStatusId; return(jobInstanceObj); SyncObjectsForJobInstanceHaveChanged: if (throwExceptionIfSyncObjectsAreDeletedOrDisabled) { throw new Exception(string.Format("Queued job '{0}' in database logger has changed sync objects.", jobInstanceInDbQueue.JobInstanceId)); } else { return(null); } } }
public ConfigurationService() { configurator = new SyncEngineDatabaseConfigurator(IntegrationWindowsService.IntegrationDbConnectionString); scheduledJobManager = new ScheduledJobManager(configurator); }
public LogManagementService() { configurator = new SyncEngineDatabaseConfigurator(IntegrationWindowsService.IntegrationDbConnectionString); }
// Start the Windows service. protected override void OnStart(string[] onStartArgs) { try { // get connection string from connectionStrings in App.config GetIntegrationDbConnectionString(); // test connection to the queue database TestIntegrationDbConnection(IntegrationDbConnectionString); _dbQueueLogger = new JobQueueDatabaseLogger(IntegrationDbConnectionString); _configurator = new SyncEngineDatabaseConfigurator(IntegrationDbConnectionString); JobQueueManager.Configurator = _configurator; _serviceConfig = _configurator.GetServiceConfig(); // reset the logger as a precaution SyncEngineLogger.Clear(); // configure mail notifications, if enabled if (_serviceConfig.EnableMailNotifications) { ConfigureMailNotifications(); } // add database and text file loggers RegisterLoggers(); // register integrations for the database and text file loggers RegisterIntegrations(); // associate the database logger with the queue manager JobQueueLogManager.AddLogger(_dbQueueLogger); // recover any job instances from a server or service restart; this will only apply to on-demand job instances _dbQueueLogger.RecoverJobInstancesFromQueueLog(); // add the next run times for each scheduled job; clear any existing scheduled jobs from the queue _scheduledJobManager = new ScheduledJobManager(_configurator); _scheduledJobManager.QueueScheduledJobs(clearExistingScheduledJobInstancesFromWaitingQueue: true); // once a scheduled job is complete (i.e. queue request), queue for the next run time JobQueueManager.JobQueueRequestStatusChanged += new EventHandler <JobQueueRequestStatusChangedArgs>((s, e) => { if (e.QueueRequest.Status == JobQueueRequestStatus.Completed && e.QueueRequest.InvocationSourceType == JobInvocationSourceType.Scheduled) { _scheduledJobManager.QueueJobForNextScheduledRunTime(e.QueueRequest.Job.Id); } }); JobQueueManager.MaxDelayedStartByJobPriority = _configurator.GetJobPriorityConfig(); JobQueueManager.Start(_serviceConfig.IntervalInSeconds); InitializeWebServiceHosts(); } catch (Exception ex) { EventViewerLogger.WriteToLog(ex); SyncEngineLogger.WriteExceptionToLog(ex); // stop the service this.Stop(); } }