/// <summary> /// Reschedule job for the specified campaign. /// </summary> /// <param name="schema">The <see cref="Terrasoft.Core.Campaign.CampaignSchema"/> object for wich Job plans.</param> /// <param name="fireTimeConfig">Fire time config for job.</param> public void RescheduleJob(CoreCampaignSchema schema, CampaignFireTimeConfig fireTimeConfig) { lock (_rescheduleLockObject) { RemoveJobs(schema.EntityId); ScheduleJob(schema, fireTimeConfig); } }
/// <summary> /// Returns config for schedule next campaign job by default campaign fire period. /// Uses to local time convertion to include daylight offset and reverts next fire time to UTC. /// </summary> /// <param name="schema">Campaign schema. /// Instance of <see cref="Terrasoft.Core.Campaign.CampaignSchema"/>.</param> /// <param name="scheduledTimeParameters">Parameters for schedule new job for campaign.</param> /// <param name="previousStepCalculatedTime">Instance of <see cref="CampaignFireTimeConfig"/> that contains /// information for schedule next campaign job by previous calculation step.</param> /// <returns>Instance of <see cref="CampaignFireTimeConfig"/> that contains /// all needed information for schedule next campaign job by current step.</returns> internal override CampaignFireTimeConfig Calculate(CoreCampaignSchema schema, CampaignScheduledTimeParameters scheduledTimeParameters, CampaignFireTimeConfig previousStepCalculatedTime) { var fireTimeConfig = new CampaignFireTimeConfig { Time = DateTime.MaxValue, ExecutionStrategy = CampaignSchemaExecutionStrategy.DefaultPeriod }; if (scheduledTimeParameters.CampaignStatusId != CampaignConsts.RunCampaignStatusId) { fireTimeConfig.ScheduledAction = CampaignScheduledAction.Start; fireTimeConfig.Time = scheduledTimeParameters.CurrentTime; return(fireTimeConfig); } var localStartDate = TimeZoneInfo.ConvertTimeFromUtc(scheduledTimeParameters.StartDate, schema.TimeZoneOffset); var localBenchmarkTime = TimeZoneInfo.ConvertTimeFromUtc(scheduledTimeParameters.BenchmarkTime, schema.TimeZoneOffset); var campaignLifeTime = localBenchmarkTime - localStartDate; var toPreviousDefault = (int)Math.Round(campaignLifeTime.TotalMinutes) % schema.DefaultCampaignFirePeriod; var nextLocalDefaultTime = toPreviousDefault == 0 && !scheduledTimeParameters.PreviousFireTime.HasValue ? localBenchmarkTime : localBenchmarkTime .AddMinutes(schema.DefaultCampaignFirePeriod - toPreviousDefault); fireTimeConfig.Time = ConvertToUtcByCampaignTimeZone(schema, nextLocalDefaultTime); return(CallNextStep(schema, scheduledTimeParameters, fireTimeConfig)); }
/// <summary> /// Schedule next job for the specified campaign. /// </summary> /// <param name="schema">The <see cref="Terrasoft.Core.Campaign.CampaignSchema"/> object for wich Job plans.</param> /// <param name="fireTimeConfig">Fire time config for job.</param> public void ScheduleJob(CoreCampaignSchema schema, CampaignFireTimeConfig fireTimeConfig) { try { schema.CheckArgumentNull(nameof(schema)); fireTimeConfig.CheckArgumentNull(nameof(fireTimeConfig)); Guid campaignId = schema.EntityId; var campaignJobName = GetCampaignJobName(campaignId, fireTimeConfig.Time); var sysUserConnection = _userConnection.AppConnection.SystemUserConnection; var parameters = new Dictionary <string, object> { { "CampaignSchemaUId", schema.UId }, { "ScheduledUtcFireTime", fireTimeConfig.Time }, { "SchemaGeneratorStrategy", fireTimeConfig.ExecutionStrategy }, { "ScheduledAction", (int)fireTimeConfig.ScheduledAction } }; IJobDetail job = AppScheduler.CreateClassJob <CampaignJobExecutor>(campaignJobName, CampaignConsts.CampaignJobGroupName, sysUserConnection, parameters); ITrigger trigger = new SimpleTriggerImpl(campaignJobName + "Trigger", CampaignConsts.CampaignJobGroupName, fireTimeConfig.Time) { MisfireInstruction = MisfireInstruction.IgnoreMisfirePolicy }; AppScheduler.Instance.ScheduleJob(job, trigger); LogScheduledJob(schema.EntityId, fireTimeConfig); } catch (Exception ex) { string message = CampaignHelper.GetLczStringValue(nameof(CampaignJobDispatcher), "ScheduleException"); Logger.ErrorFormat(message, ex, schema == null ? Guid.Empty : schema.EntityId); throw; } }
private void LogScheduledJob(Guid campaignId, CampaignFireTimeConfig jobConfig) { Guid actionId; switch (jobConfig.ScheduledAction) { case CampaignScheduledAction.Run: actionId = CampaignConsts.CampaignLogTypeScheduledRun; break; case CampaignScheduledAction.ScheduledStop: actionId = CampaignConsts.CampaignLogTypeScheduledStop; break; case CampaignScheduledAction.ScheduledStart: actionId = CampaignConsts.CampaignLogTypeScheduledStart; break; default: actionId = Guid.Empty; break; } if (actionId != Guid.Empty) { LogAction(campaignId, actionId, jobConfig.Time); } }
/// <summary> /// Calls next step in chain and returns result from this step. /// </summary> /// <param name="schema">Campaign schema. /// Instance of <see cref="Terrasoft.Core.Campaign.CampaignSchema"/></param> /// <param name="scheduledTimeParameters">Parameters which describes campaign state /// and includes parameters for calculates next fire time.</param> /// <param name="previousStepCalculatedTime"><see cref="CampaignFireTimeConfig"/> containes /// current step calculation result.</param> /// <returns>Returns <paramref name="previousStepCalculatedTime"/> when <see cref="NextCalculator"/> /// is not defined. And result of calculation from next step in otherwise.</returns> protected CampaignFireTimeConfig CallNextStep(CoreCampaignSchema schema, CampaignScheduledTimeParameters scheduledTimeParameters, CampaignFireTimeConfig previousStepCalculatedTime) { return(NextCalculator == null ? previousStepCalculatedTime : NextCalculator.Calculate(schema, scheduledTimeParameters, previousStepCalculatedTime)); }
internal override CampaignFireTimeConfig Calculate(CoreCampaignSchema schema, CampaignScheduledTimeParameters scheduledTimeParameters, CampaignFireTimeConfig previousStepCalculatedTime) { var timerElements = schema.FlowElements.OfType <CampaignTimerElement>(); CampaignFireTimeConfig fireTimeConfig = GetTimedElementsNextFireTime(timerElements, scheduledTimeParameters); return(CallNextStepWithMinValue(schema, scheduledTimeParameters, previousStepCalculatedTime, fireTimeConfig)); }
internal override CampaignFireTimeConfig Calculate(CoreCampaignSchema schema, CampaignScheduledTimeParameters scheduledTimeParameters, CampaignFireTimeConfig previousStepCalculatedTime) { var elements = schema.FlowElements .Where(x => x.ElementType.HasFlag(CampaignSchemaElementType.Transition)); var fireTimeConfig = GetTimedElementsNextFireTime(elements, scheduledTimeParameters); return(CallNextStepWithMinValue(schema, scheduledTimeParameters, previousStepCalculatedTime, fireTimeConfig)); }
/// <summary> /// Calls next step in chain with min value between <paramref name="previousStepCalculatedTime"/> and /// <paramref name="comparedCalculatedTime"/> and returns result from calculates next step. /// </summary> /// <param name="schema">Campaign schema. /// Instance of <see cref="Terrasoft.Core.Campaign.CampaignSchema"/></param> /// <param name="scheduledTimeParameters">Parameters which describes campaign state /// and includes parameters for calculates next fire time.</param> /// <param name="previousStepCalculatedTime"><see cref="CampaignFireTimeConfig"/> containes /// current step calculation result.</param> /// <param name="comparedCalculatedTime">This config should compare with /// <paramref name="previousStepCalculatedTime"/> and with minimum of this calls /// <see cref="CallNextStep(CoreCampaignSchema, CampaignScheduledTimeParameters, CampaignFireTimeConfig)"/> /// method.</param> /// <returns>Returns <paramref name="previousStepCalculatedTime"/> when <see cref="NextCalculator"/> /// is not defined. And result of calculation from next step in otherwise.</returns> protected CampaignFireTimeConfig CallNextStepWithMinValue(CoreCampaignSchema schema, CampaignScheduledTimeParameters scheduledTimeParameters, CampaignFireTimeConfig previousStepCalculatedTime, CampaignFireTimeConfig comparedCalculatedTime) { var minFireTime = comparedCalculatedTime.Time < previousStepCalculatedTime.Time && comparedCalculatedTime.Time != default(DateTime) ? comparedCalculatedTime : previousStepCalculatedTime; return(CallNextStep(schema, scheduledTimeParameters, minFireTime)); }
/// <summary> /// Schedule next job for the specified campaign. /// </summary> /// <param name="campaignSchemaUId">The unique identifier of campaign schema instance.</param> /// <param name="fireTimeConfig">Fire time config for job.</param> public void ScheduleJob(Guid campaignSchemaUId, CampaignFireTimeConfig fireTimeConfig) { try { var schemaManager = (CampaignSchemaManager)_userConnection.GetSchemaManager("CampaignSchemaManager"); CoreCampaignSchema campaignSchema = schemaManager.GetSchemaInstance(campaignSchemaUId); ScheduleJob(campaignSchema, fireTimeConfig); } catch (Exception ex) { string message = CampaignHelper.GetLczStringValue(nameof(CampaignJobDispatcher), "ScheduleBySchemaUIdException"); Logger.ErrorFormat(message, ex, campaignSchemaUId); throw; } }
internal override CampaignFireTimeConfig Calculate(CoreCampaignSchema schema, CampaignScheduledTimeParameters scheduledTimeParameters, CampaignFireTimeConfig previousStepCalculatedTime) { var fireTimeConfig = previousStepCalculatedTime; if (scheduledTimeParameters.ScheduledStopModeId == CampaignConsts.CampaingSpecifiedTimeModeId && previousStepCalculatedTime.Time >= scheduledTimeParameters.ScheduledStopDate) { fireTimeConfig = new CampaignFireTimeConfig { Time = new DateTime(scheduledTimeParameters.ScheduledStopDate.Ticks, DateTimeKind.Utc), ExecutionStrategy = CampaignSchemaExecutionStrategy.DefaultPeriod, ScheduledAction = CampaignScheduledAction.ScheduledStop }; } return(CallNextStep(schema, scheduledTimeParameters, fireTimeConfig)); }
internal override CampaignFireTimeConfig Calculate(CoreCampaignSchema schema, CampaignScheduledTimeParameters scheduledTimeParameters, CampaignFireTimeConfig previousStepCalculatedTime) { if (scheduledTimeParameters.CampaignStatusId == CampaignConsts.StoppingCampaignStatusId) { return(new CampaignFireTimeConfig { Time = scheduledTimeParameters.CurrentTime, ScheduledAction = CampaignScheduledAction.Stop, ExecutionStrategy = CampaignSchemaExecutionStrategy.DefaultPeriod }); } if (scheduledTimeParameters.ScheduledStopModeId == CampaignConsts.CampaingSpecifiedTimeModeId && scheduledTimeParameters.CurrentTime >= scheduledTimeParameters.ScheduledStopDate) { return(new CampaignFireTimeConfig { Time = scheduledTimeParameters.ScheduledStopDate, ScheduledAction = CampaignScheduledAction.ScheduledStop, ExecutionStrategy = CampaignSchemaExecutionStrategy.DefaultPeriod }); } return(CallNextStep(schema, scheduledTimeParameters, previousStepCalculatedTime)); }
/// <summary> /// Calculates nearest time to benchmark time from conditional transition and timer elements. /// </summary> /// <param name="elements">List of elements which containes time for calculates next campaign run.</param> /// <param name="scheduledTimeParameters">Parameters which describes campaign state /// and includes parameters for calculates next fire time.</param> /// <returns>Returns instance of <see cref="CampaignFireTimeConfig"/>. It containes min /// time for next schedule job, when some element are contanies times, and otherwise returns /// config that containes <see cref="CampaignFireTimeConfig.Time"/> is equal /// <see cref="DateTime.MaxValue"/>.</returns> protected CampaignFireTimeConfig GetTimedElementsNextFireTime(IEnumerable <CampaignSchemaElement> elements, CampaignScheduledTimeParameters scheduledTimeParameters) { var fireTimeConfig = new CampaignFireTimeConfig { Time = DateTime.MaxValue, ExecutionStrategy = CampaignSchemaExecutionStrategy.Immediate }; foreach (var element in elements) { var elementFireTime = element.GetFireTime(); if (!elementFireTime.HasValue) { continue; } var elementExecutionDate = new DateTime(elementFireTime.Value.Ticks); if (elementExecutionDate < fireTimeConfig.Time && elementExecutionDate > scheduledTimeParameters.BenchmarkTime) { fireTimeConfig.Time = elementExecutionDate; } } return(fireTimeConfig); }
internal virtual CampaignFireTimeConfig Calculate(CoreCampaignSchema schema, CampaignScheduledTimeParameters scheduledTimeParameters, CampaignFireTimeConfig previousStepCalculatedTime) { return(new CampaignFireTimeConfig()); }