コード例 #1
0
        /// <inheritdoc />
        public IEnumerable <ITaskRuntimeInfo> ReservePollingQueueTasks(string pollingQueueKey, int maxResults)
        {
            Trace.WriteLine("ENTER: Reserving {0} polling queue '{1}' tasks for execution ...".FormatInvariant(maxResults, pollingQueueKey));

            if (string.IsNullOrEmpty(pollingQueueKey))
            {
                throw new ArgumentNullException(nameof(pollingQueueKey));
            }

            if (maxResults < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(maxResults), maxResults, "Value must not be negative.");
            }

            string pollingQueueListKey = RedisTaskRuntimeInfoRepository.GetPollingQueueRedisKey(pollingQueueKey, TaskStatus.Pending);

            List <string> entityIds = new List <string>();

            using (IRedisPipeline pipeline = this.provider.CreatePipeline())
            {
                for (int i = 0; i < maxResults; i++)
                {
                    pipeline.PopFirstListElementAsText(pollingQueueListKey, value =>
                    {
                        if (!string.IsNullOrEmpty(value))
                        {
                            entityIds.Add(value);
                        }
                    });
                }

                pipeline.Flush();
            }

            ICollection <ITaskRuntimeInfo> result = this.GetAll(entityIds);

            Trace.WriteLine("EXIT: {0} polling queue '{1}' tasks reserved for execution.".FormatInvariant(result.Count, pollingQueueKey));

            return(result);
        }