コード例 #1
0
        private void SetAllTriggersOfJobToState(string jobName, InternalTriggerState state)
        {
            ArrayList tws = GetTriggerWrappersForJob(jobName);

            foreach (TriggerWrapper tw in tws)
            {
                tw.State = state;
                if (state != InternalTriggerState.Waiting)
                {
                    _timeTriggers.Remove(tw);
                }
            }
        }
コード例 #2
0
        private void SetAllTriggersOfJobToState(string jobName, InternalTriggerState state)
        {
            ArrayList triggerWrappersForJob = this.GetTriggerWrappersForJob(jobName);

            foreach (TriggerWrapper wrapper in triggerWrappersForJob)
            {
                wrapper.State = state;
                if (state != InternalTriggerState.Waiting)
                {
                    this._timeTriggers.Remove(wrapper);
                }
            }
        }
コード例 #3
0
        protected virtual async Task SetAllTriggersOfJobToState(JobKey jobKey, InternalTriggerState state,
                                                                CancellationToken cancellationToken)
        {
            using var session = Store.OpenAsyncSession();
            var triggers = session.Query <Trigger>()
                           .Where(t => Equals(t.Group, jobKey.Group) && Equals(t.JobName, jobKey.Name));

            foreach (var trig in triggers)
            {
                var triggerToUpdate = await session.LoadAsync <Trigger>(trig.Key, cancellationToken);

                triggerToUpdate.State = state;
            }

            await session.SaveChangesAsync(cancellationToken);
        }
コード例 #4
0
 private void SetAllTriggersOfJobToState(string jobName, InternalTriggerState state)
 {
     ArrayList tws = GetTriggerWrappersForJob(jobName);
     foreach (TriggerWrapper tw in tws)
     {
         tw.State = state;
         if (state != InternalTriggerState.Waiting)
         {
             _timeTriggers.Remove(tw);
         }
     }
 }
コード例 #5
0
ファイル: RAMJobStore.cs プロジェクト: kisflying/kion
		/// <summary>
		/// Sets the state of all triggers of job to specified state.
		/// </summary>
		/// <param name="jobName">Name of the job.</param>
		/// <param name="jobGroup">The job group.</param>
		/// <param name="state">The internal state to set.</param>
		protected internal virtual void SetAllTriggersOfJobToState(string jobName, string jobGroup, InternalTriggerState state)
		{
			ArrayList tws = GetTriggerWrappersForJob(jobName, jobGroup);
			foreach (TriggerWrapper tw in tws)
			{
				tw.state = state;
                if (state != InternalTriggerState.Waiting)
				{
					timeTriggers.Remove(tw);
				}
			}
		}
コード例 #6
0
 public TriggerInfo(TriggerKey id, InternalTriggerState state, IOperableTrigger trigger)
 {
     Id = id;
     State = state;
     Trigger = trigger;
 }
コード例 #7
0
 /// <summary>
 /// Update the given trigger to the given new state, if it is in the given
 /// old state.
 /// </summary>
 /// <param name="triggerKey">the key of the trigger</param>
 /// <param name="newState">the new state for the trigger</param>
 /// <param name="oldState">the old state the trigger must be in</param>
 /// <returns>
 /// int the number of rows updated
 /// </returns>
 private void UpdateTriggerStateFromOtherState(TriggerKey triggerKey, InternalTriggerState newState, InternalTriggerState oldState)
 {
     var query = Query.ElemMatch("Triggers", Query.And(Query.EQ("_id", triggerKey.ToBsonDocument()), Query.EQ("State", oldState)));
     var update = Update.Set("Triggers.$.State", newState);
     JobCollection.Update(query, update);
 }
コード例 #8
0
 private void UpdateTriggerState(TriggerKey triggerKey, InternalTriggerState newState)
 {
     var id = triggerKey.ToBsonDocument();
     var query = Query.ElemMatch("Triggers", Query.EQ("_id", id));
     var update = Update.Set("Triggers.$.State", newState);
     JobCollection.Update(query, update);
 }
コード例 #9
0
 private void UpdateTriggerGroupStateFromOtherStates(GroupMatcher<TriggerKey> matcher, InternalTriggerState newState, params InternalTriggerState[] oldStates)
 {
     var values = oldStates.Select(x => BsonValue.Create(x)).ToArray();
     var query = Query.ElemMatch("Triggers", Query.And(GetTriggerGroupMatcherQuery(matcher), Query.In("State", values)));
     var update = Update.Set("Triggers.$.State", newState);
     JobCollection.Update(query, update, UpdateFlags.Multi);
 }
コード例 #10
0
        private void DoUpdateOfMisfiredTrigger(IOperableTrigger trig, bool forceState, InternalTriggerState newStateIfNotComplete, bool recovering)
        {
            ICalendar cal = null;
            if (trig.CalendarName != null)
            {
                cal = RetrieveCalendar(trig.CalendarName);
            }

            signaler.NotifyTriggerListenersMisfired(trig);

            trig.UpdateAfterMisfire(cal);

            // TODO: Decide if we need to replace the whole trigger or could just update the status and next-fire-time
            if (!trig.GetNextFireTimeUtc().HasValue)
            {
                StoreTrigger(trig, null, true, InternalTriggerState.Complete, forceState, recovering);
            }
            else
            {
                StoreTrigger(trig, null, true, newStateIfNotComplete, forceState, false);
            }
        }
コード例 #11
0
        /// <summary>
        /// Determines if a Trigger for the given job should be blocked.  
        /// State can only transition to StatePausedBlocked/StateBlocked from 
        /// StatePaused/StateWaiting respectively.
        /// </summary>
        /// <returns>StatePausedBlocked, StateBlocked, or the currentState. </returns>
        private InternalTriggerState CheckBlockedState(JobKey jobKey, InternalTriggerState currentState)
        {
            // State can only transition to BLOCKED from PAUSED or WAITING.
            if ((currentState.Equals(InternalTriggerState.Waiting) == false) && (currentState.Equals(InternalTriggerState.Paused) == false))
            {
                return currentState;
            }

            try
            {
                IList<FiredTriggerRecord> lst = SelectFiredTriggerRecordsByJob(jobKey.Name, jobKey.Group);

                if (lst.Count > 0)
                {
                    FiredTriggerRecord rec = lst[0];
                    if (rec.JobDisallowsConcurrentExecution) // TODO: worry about failed/recovering/volatile job  states?
                    {
                        return (currentState == InternalTriggerState.Paused) ? InternalTriggerState.PausedAndBlocked : InternalTriggerState.Blocked;
                    }
                }

                return currentState;
            }
            catch (Exception e)
            {
                throw new JobPersistenceException("Couldn't determine if trigger should be in a blocked state '" + jobKey + "': " + e.Message, e);
            }
        }
コード例 #12
0
        protected virtual bool UpdateMisfiredTrigger(TriggerKey triggerKey, InternalTriggerState newStateIfNotComplete, bool forceState)
        {
            try
            {
                IOperableTrigger trig = RetrieveTrigger(triggerKey);

                DateTimeOffset misfireTime = SystemTime.UtcNow();
                if (MisfireThreshold > TimeSpan.Zero)
                {
                    misfireTime = misfireTime.AddMilliseconds(-1 * MisfireThreshold.TotalMilliseconds);
                }

                if (trig.GetNextFireTimeUtc().Value > misfireTime)
                {
                    return false;
                }

                DoUpdateOfMisfiredTrigger(trig, forceState, newStateIfNotComplete, false);

                signaler.NotifySchedulerListenersFinalized(trig);

                return true;
            }
            catch (Exception e)
            {
                throw new JobPersistenceException(
                    string.Format("Couldn't update misfired trigger '{0}': {1}", triggerKey, e.Message), e);
            }
        }
コード例 #13
0
        protected virtual void StoreTrigger(IOperableTrigger newTrigger, IJobDetail job, bool replaceExisting, InternalTriggerState state, bool forceState, bool recovering)
        {
            bool existingTrigger = CheckExists(newTrigger.Key);

            if ((existingTrigger) && (!replaceExisting))
            {
                throw new ObjectAlreadyExistsException(newTrigger);
            }

            try
            {
                if (!forceState)
                {
                    bool shouldBepaused = IsTriggerGroupPaused(newTrigger.Key.Group);

                    if (!shouldBepaused)
                    {
                        shouldBepaused = IsTriggerGroupPaused(AllGroupsPaused);

                        if (shouldBepaused)
                        {
                            InsertPausedTriggerGroup(newTrigger.Key.Group);
                        }
                    }

                    if (shouldBepaused && (state.Equals(InternalTriggerState.Waiting) || state.Equals(InternalTriggerState.Acquired)))
                    {
                        state = InternalTriggerState.Paused;
                    }
                }

                if (job == null)
                {
                    var jobId = newTrigger.JobKey.ToBsonDocument();
                    var jobInfo = JobCollection.FindOneById(jobId);
                    job = jobInfo.Job;
                }

                if (job == null)
                {
                    throw new JobPersistenceException("The job (" + newTrigger.JobKey + ") referenced by the trigger does not exist.");
                }

                if (job.ConcurrentExectionDisallowed && !recovering)
                {
                    state = CheckBlockedState(job.Key, state);
                }

                var triggerInfo = new TriggerInfo(newTrigger.Key, state, newTrigger);

                if (existingTrigger)
                {
                    var id = job.Key.ToBsonDocument();
                    var query = Query.And(Query.EQ("_id", id), Query.EQ("Triggers._id", newTrigger.Key.ToBsonDocument()));
                    var update = Update.Set("Triggers.$", triggerInfo.ToBsonDocument());
                    JobCollection.Update(query, update);
                }
                else
                {
                    var id = job.Key.ToBsonDocument();
                    var query = Query.EQ("_id", id);
                    var update = Update.Push("Triggers", triggerInfo.ToBsonDocument()).Inc("TriggerCount", 1);
                    JobCollection.Update(query, update);
                }
            }
            catch (Exception ex)
            {
                // throw new ObjectAlreadyExistsException(newJob)
                string message = String.Format("Couldn't store trigger '{0}' for '{1}' job: {2}", newTrigger.Key, newTrigger.JobKey, ex.Message);
                throw new JobPersistenceException(message, ex);
            }
        }