public JobQueueRequest(Guid queueRequestGuid, Integration integration, Job job, JobInvocationSourceType invocationSourceType) { if (queueRequestGuid == Guid.Empty) { Id = Guid.NewGuid(); } else { Id = queueRequestGuid; } if (integration == null) { throw new Exception("Integration can not be null."); } if (job == null) { throw new Exception("Job can not be null."); } Integration = integration; Job = job; InvocationSourceType = invocationSourceType; }
public JobInstance(JobQueueRequest queueRequest, Guid jobInstanceGuid, Integration integration, Job jobToRun, DataSource sourceDataSource, DataSource targetDataSource, List <JobStepInstance> jobStepInstances, DateTime scheduledStartTime, string invocationSource, JobInvocationSourceType invocationSourceType, List <JobFilter> filters = null) { if (integration == null) { throw new Exception("Integration can not be null."); } if (jobToRun == null) { throw new Exception("Job to run can not be null."); } if (sourceDataSource == null) { throw new Exception("Source-side data source can not be null."); } if (jobToRun.SourceDataSources.Where(d => d.Value.Id == sourceDataSource.Id).Count() == 0) { throw new Exception(string.Format("'{0}' ({1}) is not associated with job '{2}' ({3}) as a source-side data source.", sourceDataSource.Name, sourceDataSource.Id, jobToRun.Name, jobToRun.Id)); } if (targetDataSource == null) { throw new Exception("Target-side data source can not be null."); } if (jobToRun.TargetDataSource.Id != targetDataSource.Id) { throw new Exception(string.Format("'{0}' ({1}) is not associated with job '{2}' ({3}) as the target-side data source.", targetDataSource.Name, targetDataSource.Id, jobToRun.Name, jobToRun.Id)); } if (jobStepInstances == null || jobStepInstances.Count == 0) { throw new Exception(string.Format("At least one job step is required for queued job '{0}'. The job will not be executed.", jobToRun.Name)); } QueueRequest = queueRequest; if (jobInstanceGuid == Guid.Empty) { Id = Guid.NewGuid(); } else { Id = jobInstanceGuid; } Integration = integration; Job = jobToRun; if (JobQueueManager.Configurator == null) { SourceDataSource = new JobDataSource(SyncSide.Source, sourceDataSource); TargetDataSource = new JobDataSource(SyncSide.Target, targetDataSource); SyncEngineLogger.WriteToLog(LogEntryType.Warning, integration, "Update history could not be set for source and target data sources. No configurator has been set for the JobQueueManager."); } else { var runHistory = JobQueueManager.Configurator.GetJobDataSourceRunHistory(jobToRun.Id, sourceDataSource.Id, targetDataSource.Id); SourceDataSource = new JobDataSource(SyncSide.Source, sourceDataSource, runHistory); TargetDataSource = new JobDataSource(SyncSide.Target, targetDataSource, runHistory); } if (filters != null) { _filters = filters; } _jobStepInstances = jobStepInstances.OrderBy(d => d.OrderIndex).ToList(); ScheduledStartTime = scheduledStartTime; InvocationSource = invocationSource; InvocationSourceType = invocationSourceType; Id = Guid.NewGuid(); foreach (var jobStepInstance in _jobStepInstances) { jobStepInstance.AssociatedJobInstance = this; } }
public JobQueueRequest(Integration integration, Job job, JobInvocationSourceType invocationSourceType) : this(Guid.Empty, integration, job, invocationSourceType) { }
public JobInstance(JobQueueRequest queueRequest, Integration integration, Job jobToRun, DataSource sourceDataSource, DataSource targetDataSource, List <JobStepInstance> jobStepInstances, DateTime scheduledStartTime, string invocationSource, JobInvocationSourceType invocationSourceType, List <JobFilter> filters = null) : this(queueRequest, Guid.Empty, integration, jobToRun, sourceDataSource, targetDataSource, jobStepInstances, scheduledStartTime, invocationSource, invocationSourceType, filters) { }
public JobInstance QueueJobWithFilters(Integration integration, DataSource sourceSideDataSourceToRun, Job jobToRun, DateTime scheduledStartTime, string invocationSource, JobInvocationSourceType invocationType, List <JobFilter> filters) { try { return(JobQueueManager.QueueJob(integration, sourceSideDataSourceToRun, jobToRun, scheduledStartTime, invocationSource, invocationType, filters)); } catch (Exception ex) { SyncEngineLogger.WriteExceptionToLog(ex, WEB_SERVICE_EXCEPTION_MESSAGE); throw; } }
public List <JobInstance> QueueJob(Integration integration, IEnumerable <DataSource> sourceSideDataSourcesToRun, Job jobToRun, DateTime scheduledStartTime, string invocationSource, JobInvocationSourceType invocationType) { try { return(JobQueueManager.QueueJob(integration, sourceSideDataSourcesToRun, jobToRun, scheduledStartTime, invocationSource, invocationType)); } catch (Exception ex) { SyncEngineLogger.WriteExceptionToLog(ex, WEB_SERVICE_EXCEPTION_MESSAGE); throw; } }
public static List <JobInstance> QueueJob(Integration integration, IEnumerable <DataSource> sourceSideDataSourcesToRun, Job jobToRun, DateTime scheduledStartTime, string invocationSource, JobInvocationSourceType invocationSourceType, List <JobFilter> filters = null) { if (integration == null) { throw new Exception("Integration is missing or empty."); } if (sourceSideDataSourcesToRun == null || sourceSideDataSourcesToRun.Where(d => d != null).Count() == 0) { throw new Exception(string.Format("At least one source-side data source is required to queue job '{0}'.", jobToRun.Name)); } foreach (var dataSource in sourceSideDataSourcesToRun) { if (!jobToRun.SourceDataSources.ContainsKey(dataSource.Name)) { throw new Exception(string.Format("Source-side data source '{0}' does not exist for job '{1}'. This job will not be queued for execution.", dataSource.Name, jobToRun.Name)); } } if (String.IsNullOrWhiteSpace(invocationSource)) { throw new Exception("Invocation source is missing or empty."); } if (!integration.IsEnabled) { throw new Exception(string.Format("Job '{0}' could not be queued for execution because integration '{1}' is disabled.", jobToRun.Name, integration.Name)); } if (!jobToRun.IsEnabled) { throw new Exception(string.Format("Job '{0}' could not be queued for execution because it is disabled.", jobToRun.Name)); } if (jobToRun.Steps.Where(d => d.IsEnabled).Count() == 0) { throw new Exception(string.Format("Job '{0}' could not be queued for execution because no job steps exist or all are disabled.", jobToRun.Name)); } SetMaxConcurrentThreadsForIntegration(integration); List <JobInstance> queuedJobs = new List <JobInstance>(); JobInstance jobInstance; JobStepInstance jobStepInstance; List <JobStepInstance> jobStepInstances; var queueRequest = new JobQueueRequest(integration, jobToRun, invocationSourceType); queueRequest.StatusChanged += new EventHandler <JobQueueRequestStatusChangedArgs>(HandleChangedQueueRequestStatus); queueRequest.Status = JobQueueRequestStatus.Waiting; foreach (var sourceSideDataSource in sourceSideDataSourcesToRun) { byte jobStepIdx = 0; jobStepInstances = new List <JobStepInstance>(); foreach (var jobStep in jobToRun.Steps) { if (jobStep.IsEnabled) { jobStepInstance = new JobStepInstance(jobStep, jobStepIdx); jobStepInstance.StatusChanged += new EventHandler <JobStepQueueStatusChangedArgs>(HandleChangedJobStepStatus); jobStepInstances.Add(jobStepInstance); //jobStepInstance.Status = JobStepQueueStatus.Waiting; jobStepIdx++; } } jobInstance = new JobInstance(queueRequest, integration, jobToRun, sourceSideDataSource, jobToRun.TargetDataSource, jobStepInstances, scheduledStartTime, invocationSource, invocationSourceType, filters); queueRequest.JobInstances.Add(jobInstance); // change the status here to avoid the job step not having an association with the job instance when status changes are logged foreach (var jobStepInstanceToFireStatusChangeFor in jobStepInstances) { jobStepInstanceToFireStatusChangeFor.Status = JobStepQueueStatus.Waiting; } jobInstance.StatusChanged += new EventHandler <JobQueueStatusChangedArgs>(HandleChangedJobStatus); if (waitingJobsByIntegrationId.ContainsKey(jobInstance.Integration.Id)) { waitingJobsByIntegrationId[jobInstance.Integration.Id].Add(jobInstance); } else { waitingJobsByIntegrationId.Add(jobInstance.Integration.Id, new List <JobInstance>() { jobInstance }); } // cache the job instance in memory if on-demand (temporary to get around OutOfMemoryException) if (jobInstance.InvocationSourceType == JobInvocationSourceType.OnDemand) { jobInstancesById.Add(jobInstance.Id, jobInstance); queueRequestsById.Add(queueRequest.Id, queueRequest); } jobInstance.Status = JobQueueStatus.Scheduled; queuedJobs.Add(jobInstance); if (JobQueued != null) { JobQueued(null, new JobQueuedArgs(jobInstance)); } } return(queuedJobs); }
public static JobInstance QueueJob(Integration integration, DataSource sourceSideDataSourceToRun, Job jobToRun, DateTime scheduledStartTime, string invocationSource, JobInvocationSourceType invocationType, List <JobFilter> filters = null) { var jobInstances = QueueJob(integration, new List <DataSource>() { sourceSideDataSourceToRun }, jobToRun, scheduledStartTime, invocationSource, invocationType, filters); if (jobInstances == null || jobInstances.Count == 0) { return(null); } else { return(jobInstances[0]); } }