Example #1
0
        public IList <QueueWithTopEnqueuedJobsDto> Queues()
        {
            var tuples = _storage.QueueProviders
                         .Select(x => x.GetJobQueueMonitoringApi())
                         .SelectMany(x => x.GetQueues(), (monitoring, queue) => new { Monitoring = monitoring, Queue = queue })
                         .OrderBy(x => x.Queue)
                         .ToArray();

            var result = new List <QueueWithTopEnqueuedJobsDto>(tuples.Length);

            foreach (var tuple in tuples)
            {
                var enqueuedJobIds = tuple.Monitoring.GetEnqueuedJobIds(tuple.Queue, 0, 5);
                var counters       = tuple.Monitoring.GetEnqueuedAndFetchedCount(tuple.Queue);

                var firstJobs = _storage.UseStatelessSessionInTransaction(session => EnqueuedJobs(session, enqueuedJobIds));

                result.Add(new QueueWithTopEnqueuedJobsDto
                {
                    Name      = tuple.Queue,
                    Length    = counters.EnqueuedCount ?? 0,
                    Fetched   = counters.FetchedCount,
                    FirstJobs = firstJobs
                });
            }

            return(result);
        }
Example #2
0
        public IFetchedJob Dequeue(string[] queues, CancellationToken cancellationToken)
        {
            if (queues == null)
            {
                throw new ArgumentNullException(nameof(queues));
            }
            if (queues.Length == 0)
            {
                throw new ArgumentException("Queue array must be non-empty.", "queues");
            }
            Logger.Debug("Attempting to dequeue");

            var timeoutSeconds = _storage.Options.InvisibilityTimeout.Negate().TotalSeconds;

            while (!cancellationToken.IsCancellationRequested)
            {
                try
                {
                    var fluentNHibernateDistributedLock = FluentNHibernateDistributedLock.Acquire(_storage, "JobQueue",
                                                                                                  _storage.Options.JobQueueDistributedLockTimeout);
                    using (fluentNHibernateDistributedLock)
                    {
                        var fluentNHibernateFetchedJob = SqlUtil.WrapForTransaction(() =>
                        {
                            return(_storage.UseStatelessSessionInTransaction(session =>
                            {
                                var jobQueueFetchedAt = _storage.UtcNow;

                                var cutoff = jobQueueFetchedAt.AddSeconds(timeoutSeconds);
                                if (Logger.IsDebugEnabled())
                                {
                                    Logger.Debug(string.Format("Getting jobs where {0}=null or {0}<{1}",
                                                               nameof(_JobQueue.FetchedAt), cutoff));
                                }

                                var jobQueue = session.Query <_JobQueue>()
                                               .FirstOrDefault(i =>
                                                               (i.FetchedAt == null ||
                                                                i.FetchedAt < cutoff) && queues.Contains(i.Queue));
                                if (jobQueue != null)
                                {
                                    jobQueue.FetchToken = Guid.NewGuid().ToString();
                                    jobQueue.FetchedAt = jobQueueFetchedAt;
                                    session.Update(jobQueue);


                                    Logger.DebugFormat("Dequeued job id {0} from queue {1}",
                                                       jobQueue.Job.Id,
                                                       jobQueue.Queue);
                                    var fetchedJob = new FetchedJob
                                    {
                                        Id = jobQueue.Id,
                                        JobId = jobQueue.Job.Id,
                                        Queue = jobQueue.Queue
                                    };
                                    return new FluentNHibernateFetchedJob(_storage, fetchedJob);
                                }


                                return null;
                            }));
                        });
                        if (fluentNHibernateFetchedJob != null)
                        {
                            return(fluentNHibernateFetchedJob);
                        }
                    }
                }
                catch (DistributedLockTimeoutException)
                {
                    Logger.Debug("Distributed lock acquisition timeout was exceeded");
                }


                cancellationToken.Wait(_storage.Options.QueuePollInterval);
            }

            return(null);
        }