コード例 #1
0
        /// <summary>
        /// Cancel active transition. 
        /// Returns tokens to input places if the transition has been STARTED.
        /// </summary>
        /// <param name="correlationId"></param>
        private void CancelTransition(string correlationId)
        {
            TaskShell at = GetActiveTransition(correlationId);
            if (at == null) throw new Exception("Invalid correlation Id");
            log.Info("Cancelling transition {0}", at.ToString());
            if (at.Status != TransitionStatus.ENABLED && at.Status != TransitionStatus.STARTED) throw new Exception("Invalid transition status");
            if (at.Status == TransitionStatus.STARTED)
            {
                //return tokens to input places
                foreach (string plid in at.AllocatedPlaces)
                {
                    AddToken(plid);
                }
            }
            at.CancelTask();
            at.Status = TransitionStatus.CANCELLED;

            ActiveTransitionCancelled ac = new ActiveTransitionCancelled();
            ac.CorrelationId = at.CorrelationId;
            ac.DefinitionId = ProcessDefinitionId;
            ac.InstanceId = InstanceId;
            ac.TaskId = at.TaskId;
            ac.TaskType = Definition.GetTask(at.TaskId).GetType().Name;
            NotifyProcessEvent(ac);
        }
コード例 #2
0
 /// <summary>
 /// Cancel active transition instance
 /// How do we do that?
 /// 1. Do activity-specific cancellation
 /// 2. Update status of each input token: if it has no more enabled transitions, put it into READY state. Otherwise, leave it in WAITING_TASK
 /// </summary>
 /// <param name="at"></param>
 private void CancelActiveTransition(TaskShell at)
 {
     log.Info("Cancelling transition {0}", at.CorrelationId);
     if (at.IsImmediate) throw new Exception("Cannot cancel an immediate transition");
     if (at.Status != TransitionStatus.ENABLED && at.Status != TransitionStatus.STARTED) throw new Exception("Invalid transition status");
     at.CancelTask();
     Debug.Assert(at.Status == TransitionStatus.CANCELLED);
     foreach (string t in at.Tokens)
     {
         Token tok = GetToken(t);
         Debug.Assert(tok.Status == TokenStatus.LOCKED_ENABLED || tok.Status == TokenStatus.LOCKED_ALLOCATED);
         Debug.Assert(tok.ActiveTransitions.Contains(at.CorrelationId));
         if (!tok.ActiveTransitions.Remove(at.CorrelationId)) throw new Exception("Error removing transition id from token"); //should never happen
         if (tok.ActiveTransitions.Count == 0)
         {
             tok.Status = TokenStatus.READY;
         }
     }
     ActiveTransitionCancelled ac = new ActiveTransitionCancelled();
     ac.CorrelationId = at.CorrelationId;
     ac.DefinitionId = ProcessDefinitionId;
     ac.InstanceId = InstanceId;
     ac.TaskId = at.TaskId;
     ac.TaskType = Definition.GetTask(at.TaskId).GetType().Name;
     NotifyProcessEvent(ac);
 }