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)); }
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); }
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); }