/// <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);
     }
 }
Exemple #2
0
            /// <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);
            }
        }
Exemple #5
0
 /// <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));
 }
Exemple #6
0
            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));
            }
Exemple #7
0
            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));
            }
Exemple #8
0
            /// <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;
     }
 }
Exemple #10
0
            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));
            }
Exemple #11
0
 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));
 }
Exemple #12
0
            /// <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);
            }
Exemple #13
0
 internal virtual CampaignFireTimeConfig Calculate(CoreCampaignSchema schema,
                                                   CampaignScheduledTimeParameters scheduledTimeParameters,
                                                   CampaignFireTimeConfig previousStepCalculatedTime)
 {
     return(new CampaignFireTimeConfig());
 }