Beispiel #1
0
        Job EndTree(Job job, JobStatus endStatus)
        {
            // If this is the root, mutate to completed status.
            if (job.ParentId == null)
            {
                return(_jobMutator.Mutate <EndTransition>(job, status: JobStatus.Completed));
            }

            job = _jobMutator.Mutate <EndTransition>(job, PendingEndStatus[endStatus]);

            /*
             * First, load the parent, find the await record for this job and
             * update its status to end status.
             */
// ReSharper disable once PossibleInvalidOperationException
            var parent = _jobRepository.Load(job.ParentId.Value);
            var @await = parent.Continuation.Find(job);

            @await.Status = endStatus;

            /*
             * After we set the await's status, invoke ContinuationDispatcher to
             * ensure any pending await for parent is dispatched.
             * If ContinuationDispatcher returns any awaits, that means parent job is not
             * ready for completion.
             */
            var pendingAwaits = _continuationDispatcher.Dispatch(parent);

            if (!pendingAwaits.Any())
            {
                EndTree(parent, JobStatus.Completed);
            }

            return(_jobMutator.Mutate <EndTransition>(job, endStatus));
        }
Beispiel #2
0
        public void Verify(Guid id)
        {
            // First load the current version of job
            var currentJob = _persistenceStore.Load(id);

            if (currentJob.Status != JobStatus.WaitingForChildren)
            {
                return;
            }

            _continuationDispatcher.Dispatch(currentJob);
        }
Beispiel #3
0
        public Job Transit(Job job, Activity activity)
        {
            if (job == null)
            {
                throw new ArgumentNullException("job");
            }
            if (activity == null)
            {
                throw new ArgumentNullException("activity");
            }

            var converted = _activityToContinuationConverter.Convert(activity, job);

            _persistenceStore.Store(converted.Jobs);

            job = _jobMutator.Mutate <WaitingForChildrenTransition>(job, status: JobStatus.WaitingForChildren,
                                                                    continuation: converted.Continuation);

            _recoverableAction.Run(() => _continuationDispatcher.Dispatch(job));

            return(job);
        }