public Job Transit(Job job, JobStatus endStatus) { if (job == null) { throw new ArgumentNullException("job"); } if (!EndStatuses.Contains(endStatus)) { throw new ArgumentOutOfRangeException("endStatus", endStatus, "Not a valid end status."); } return(job.ParentId == null? _jobMutator.Mutate <EndTransition>(job, status : endStatus) : EndTree(job, endStatus)); }
public static IJobMutator Stub <T>(this IJobMutator jobMutator, World world) { if (jobMutator == null) { throw new ArgumentNullException("JobMutator"); } if (world == null) { throw new ArgumentNullException("world"); } jobMutator.Mutate <T>(null).ReturnsForAnyArgs(c => { var args = c.Args(); var job = (Job)args[0]; var newJob = new Job(job.Id, job.Type, job.Method, job.Arguments, job.CreatedOn, job.RootId, job.ParentId, job.CorrelationId, (JobStatus?)args[1] ?? job.Status, (int?)args[2] ?? job.DispatchCount, (DateTime?)args[3] ?? job.RetryOn, job.ExceptionFilters, (Continuation)args[4] ?? job.Continuation, (bool?)args[5] ?? job.Suspended); world.PersistenceStore.Load(job.Id).Returns(newJob); return(newJob); }); return(jobMutator); }
public Job Change(Job job, JobStatus newStatus, Activity activity = null) { switch (newStatus) { case JobStatus.Ready: return(CheckStatusAndInvoke(job, new[] { JobStatus.Created }, () => _jobMutator.Mutate <StatusChanger>(job, status: newStatus))); case JobStatus.Running: return(CheckStatusAndInvoke(job, RunnableStatuses, () => _runningTransition.Transit(job))); case JobStatus.Completed: return(CheckStatusAndInvoke(job, CompletableStatus, () => _endTransition.Transit(job, JobStatus.Completed))); case JobStatus.Failed: return(CheckStatusAndInvoke(job, FallibleStatuses, () => _failedTransition.Transit(job))); case JobStatus.WaitingForChildren: return(CheckStatusAndInvoke(job, AwaitableStatus, () => _waitingForChildrenTransition.Transit(job, activity))); case JobStatus.Poisoned: return(CheckStatusAndInvoke(job, PoisonableStatus, () => _endTransition.Transit(job, JobStatus.Poisoned))); } return(job); }
public Guid Schedule(Activity activity, Guid?correlationId = null) { if (activity == null) { throw new ArgumentNullException("activity"); } if (correlationId != null) { var existing = _persistenceStore.LoadBy(correlationId.Value); if (existing != null) { return(existing.Id); } } var job = new Job(Guid.NewGuid(), typeof(JobRoot), "Run", new object[0], _now(), correlationId: correlationId, status: JobStatus.WaitingForChildren); var converted = _activityToContinuationConverter.Convert(activity, job); _persistenceStore.Store(converted.Jobs); job = _jobMutator.Mutate <Scheduler>(job, continuation: converted.Continuation); _router.Route(job); return(job.Id); }
async Task <Job[]> LoadSuspended() { var list = new List <Job>(); while (list.Count == 0) { try { var max = Configuration.MaxQueueLength; var items = (Configuration.Type != null ? _persistenceStore.LoadSuspended(Configuration.Type, max) : _persistenceStore.LoadSuspended(_allActivityConfiguration.Select(c => c.Type), max)) .ToArray(); _eventStream.Publish <JobQueue>(EventType.Activity, EventProperty.ActivityName("LoadSuspendedItemsStarted"), EventProperty.Named("NumberOfItems", items.Length)); list.AddRange(items.Select(item => _jobMutator.Mutate <JobQueue>(item, suspended: false))); } catch (Exception e) { if (e.IsFatal()) { throw; } _eventStream.Publish <JobQueue>(e); } if (!list.Any()) { await Task.Delay(Configuration.RetryDelay); } } _eventStream.Publish <JobQueue>(EventType.Activity, EventProperty.ActivityName("LoadSuspendedItemsFinished"), EventProperty.Named("NumberOfItems", list.Count)); return(list.ToArray()); }
public Continuation[] Dispatch(Job job) { if (job == null) { throw new ArgumentNullException("job"); } var readyContinuations = job.Continuation.PendingContinuations().ToArray(); foreach (var continuation in readyContinuations) { continuation.Status = JobStatus.Ready; } _jobMutator.Mutate <ContinuationDispatcher>(job, continuation: job.Continuation); DispatchCore(readyContinuations); return(readyContinuations); }
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); }
public Job Transit(Job job) { return(_jobMutator.Mutate <RunningTransition>(job, status: JobStatus.Running, dispatchCount: job.DispatchCount + 1)); }
public Job Transit(Job job) { return(_jobMutator.Mutate <FailedTransition>(job, status: JobStatus.Failed, retryOn: _now() + _configuration.For(job.Type).RetryDelay)); }