Beispiel #1
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 #2
0
        public QueueConfiguration Create()
        {
            var readyItems         = _persistenceStore.LoadBy(JobStatus.Ready).ToArray();
            var runningItems       = _persistenceStore.LoadBy(JobStatus.Running).ToArray();
            var failedItems        = _persistenceStore.LoadBy(JobStatus.Failed).ToArray();
            var waitingForChildren = _persistenceStore.LoadBy(JobStatus.WaitingForChildren).ToArray();

            var partiallyCompletedItems =
                _persistenceStore.LoadBy(JobStatus.ReadyToComplete)
                .Concat(_persistenceStore.LoadBy(JobStatus.ReadyToPoison)).ToArray();

            var all =
                partiallyCompletedItems.Concat(readyItems)
                .Concat(failedItems)
                .Concat(waitingForChildren)
                .Concat(runningItems)
                .ToArray();

            var totalSuspendedItemsInSpecificQueues = 0;
            var activitySpecificQueues = new Dictionary <Type, IJobQueue>();

            foreach (var activityConfiguration in _configuration.ActivityConfiguration)
            {
                var suspendedCount = _persistenceStore.CountSuspended(activityConfiguration.Type);
                var filtered       = Filter(all, activityConfiguration.Type);
                all = filtered.Item2;
                totalSuspendedItemsInSpecificQueues += suspendedCount;

                activitySpecificQueues[activityConfiguration.Type] =
                    new JobQueue(filtered.Item1, suspendedCount, activityConfiguration,
                                 _configuration.ActivityConfiguration, _persistenceStore, _eventStream, _recoverableAction, _jobMutator);

                PublishQueueInitializedEvent(filtered.Item1.Length, suspendedCount, activityConfiguration.Type);
            }

            var suspendedCountForDefaultQueue = _persistenceStore.CountSuspended(null) -
                                                totalSuspendedItemsInSpecificQueues;

            var defaultQueue = new JobQueue(all, suspendedCountForDefaultQueue,
                                            _configuration.DefaultActivityConfiguration, _configuration.ActivityConfiguration, _persistenceStore,
                                            _eventStream, _recoverableAction, _jobMutator);

            PublishQueueInitializedEvent(all.Length, suspendedCountForDefaultQueue);

            return(new QueueConfiguration(defaultQueue, activitySpecificQueues));
        }