예제 #1
0
        protected void ReorderQueue(Job job, Queue <Job> queue, int queuePosition)
        {
            var remainingJobs   = new List <Job>();
            var rebalancedQueue = new Queue <Job>();

            foreach (var queueJob in queue)
            {
                if (QueuesScore.CompareScore(job.Duration() + queueJob.Duration()).Equals(0))
                {
                    remainingJobs = queue.Where(j => j.Id != queueJob.Id).ToList();
                    rebalancedQueue.Enqueue(queueJob);
                    rebalancedQueue.Enqueue(job);
                    Queues[queuePosition] = rebalancedQueue;
                    QueuesScore.ResetScore(queuePosition, job.Duration() + queueJob.Duration());

                    break;
                }

                remainingJobs.Add(queueJob);
            }

            if (rebalancedQueue.Count == 0)
            {
                rebalancedQueue.Enqueue(job);
                Queues[queuePosition] = rebalancedQueue;
                QueuesScore.ResetScore(queuePosition, job.Duration());
            }

            foreach (var remainingJob in remainingJobs)
            {
                AddJobToQueue(remainingJob, ++queuePosition);
            }
        }
예제 #2
0
        protected Queue <Job> EnqueueJob(Job job, Queue <Job> queue, int queuePosition = 0)
        {
            if (queue.Count > 0 && QueuesScore.HasQueueSurpassedScore(queuePosition, job.Duration()))
            {
                ReorderQueue(job, queue, queuePosition);

                return(queue);
            }

            queue.Enqueue(job);
            QueuesScore.RefreshScore(queuePosition, job.Duration());

            return(queue);
        }
예제 #3
0
        protected void AddJobToQueue(Job job, int queueRow = 0)
        {
            if (Queues.Count <= queueRow)
            {
                Queues.Add(EnqueueJob(job, new Queue <Job>(), queueRow));

                return;
            }

            if (QueuesScore.EqualsScore(job.Duration()))
            {
                Queues.Add(EnqueueJob(job, new Queue <Job>(), Queues.Count));

                return;
            }

            while (queueRow < Queues.Count)
            {
                if (!IsSchedulable(queueRow, job))
                {
                    queueRow++;
                    continue;
                }

                EnqueueJob(job, Queues[queueRow], queueRow);

                return;
            }

            Queues.Add(EnqueueJob(job, new Queue <Job>(), queueRow));
        }
예제 #4
0
 protected bool IsSchedulable(int queuePosition, Job job)
 {
     return(!QueuesScore.HasQueueReachedScore(queuePosition) &&
            !(QueuesScore.HasQueueSurpassedScore(queuePosition, job.Duration()) &&
              Queues[queuePosition].Count == 1));
 }