Пример #1
0
        void ProcessAll(Guid id, ConcurrentQueue <CoordinationRequest> q)
        {
            _eventStream.Publish <JobCoordinator>(EventType.Activity,
                                                  EventProperty.ActivityName("CoordinatedEventProcessingCycleStarted"));

            while (true)
            {
                CoordinationRequest request;
                if (q.TryDequeue(out request))
                {
                    _recoverableAction.Run(request.Action, () => Run(request.Job, request.Action));
                }
                else
                {
                    lock (_latch)
                    {
                        if (q.IsEmpty)
                        {
                            _coordinationQueues.Remove(id);
                            break;
                        }
                    }
                }
            }

            _eventStream.Publish <JobCoordinator>(EventType.Activity,
                                                  EventProperty.ActivityName("CoordinatedEventProcessingCycleFinished"));
        }
Пример #2
0
 void PublishQueueInitializedEvent(int activityCount, int suspendedCount, Type activityType = null)
 {
     _eventStream.Publish <JobQueueFactory>(
         EventType.Activity,
         EventProperty.ActivityName("JobQueueInitialized"),
         EventProperty.Named("ActivityType", activityType == null ? "All" : activityType.FullName),
         EventProperty.Named("ActivityCount", activityCount),
         EventProperty.Named("SuspendedCount", suspendedCount));
 }
Пример #3
0
        public void Add(Job job)
        {
            _eventStream.Publish <FailedJobQueue>(
                EventType.Activity,
                EventProperty.ActivityName("NewFailedItem"),
                EventProperty.JobSnapshot(job));

            _jobFailures.Add(Tuple.Create(job.Id, job.RetryOn));
        }
Пример #4
0
        void OnTick(object state)
        {
            var ready    = new Collection <Tuple <Guid, DateTime?> >();
            var notReady = new Collection <Tuple <Guid, DateTime?> >();

            try
            {
                Tuple <Guid, DateTime?> item;

                _eventStream.Publish <FailedJobQueue>(
                    EventType.TimerActivity,
                    EventProperty.ActivityName("RescheduleFailedJobs"),
                    EventProperty.Named("FailedItemsQueueLength", _jobFailures.Count));

                while (_jobFailures.TryTake(out item))
                {
                    if (item.Item2 < _now())
                    {
                        ready.Add(item);
                    }
                    else
                    {
                        notReady.Add(item);
                    }
                }

                foreach (var job in ready.Select(i => _persistenceStore.Load(i.Item1)))
                {
                    _router.Route(job);
                }

                ready.Clear();
            }
            catch (Exception e)
            {
                if (e.IsFatal())
                {
                    throw;
                }

                _eventStream.Publish <FailedJobQueue>(e);
            }
            finally
            {
                foreach (var item in ready.Concat(notReady))
                {
                    _jobFailures.Add(item);
                }

                _timer.Change(_configuration.RetryTimerInterval, Timeout.InfiniteTimeSpan);
            }
        }
Пример #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());
        }
Пример #6
0
        void OnTick(object state)
        {
            try
            {
                var maxItemsToRetry = _itemsToRecover.Count;

                _eventStream.Publish <RecoverableAction>(
                    EventType.TimerActivity,
                    EventProperty.ActivityName("RecoveryTimer"),
                    new KeyValuePair <string, object>(
                        "NumberOfItemsToProcess",
                        maxItemsToRetry));

                for (var i = 0; i < maxItemsToRetry; i++)
                {
                    RecoverableActionRequest request;
                    if (!_itemsToRecover.TryDequeue(out request))
                    {
                        break;
                    }

                    Task.Run(() => RunCore(request)).FailFastOnException();
                }
            }
            catch (Exception e)
            {
                if (e.IsFatal())
                {
                    throw;
                }

                _eventStream.Publish <RecoverableAction>(e);
            }
            finally
            {
                _timer.Change(_configuration.RetryTimerInterval, Timeout.InfiniteTimeSpan);
            }
        }