Beispiel #1
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #7
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);
        }
Beispiel #8
0
 public Job Transit(Job job)
 {
     return(_jobMutator.Mutate <RunningTransition>(job,
                                                   status: JobStatus.Running,
                                                   dispatchCount: job.DispatchCount + 1));
 }
Beispiel #9
0
 public Job Transit(Job job)
 {
     return(_jobMutator.Mutate <FailedTransition>(job, status: JobStatus.Failed,
                                                  retryOn: _now() + _configuration.For(job.Type).RetryDelay));
 }