Exemplo n.º 1
0
        public void ShouldReturnAvailableNodes()
        {
            NodeManager.AddWorkerNode(new Uri("http://localhost:9051/"));

            var jobQueueItem = new JobQueueItem
            {
                JobId      = Guid.NewGuid(),
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test"
            };

            JobManager.AddItemToJobQueue(jobQueueItem);
            JobManager.AssignJobToWorkerNodes();

            TestHelper.AddDeadNode("http://localhost:9052/");
            NodeManager.AddWorkerNode(new Uri("http://localhost:9053/"));

            List <Uri> nodes;

            using (var sqlConnection = new SqlConnection(ManagerConfiguration.ConnectionString))
            {
                sqlConnection.Open();
                nodes = JobRepositoryCommandExecuter.SelectAllAvailableWorkerNodes(sqlConnection);
            }
            nodes.Count.Should().Be.EqualTo(1);
            nodes.First().Should().Be.EqualTo("http://localhost:9053/");
        }
Exemplo n.º 2
0
        public void ShouldSendTheJobToAnotherNodeIfFirstReturnsConflict()
        {
            var jobQueueItem = new JobQueueItem
            {
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test"
            };

            var workerNode2 = new WorkerNode
            {
                Url = new Uri("http://localhost:9051/")
            };

            NodeRepository.AddWorkerNode(_workerNode);
            Thread.Sleep(TimeSpan.FromSeconds(1));
            NodeRepository.AddWorkerNode(workerNode2);
            ThisNodeIsBusy(workerNode2.Url);

            ManagerController.AddItemToJobQueue(jobQueueItem);

            while (true)
            {
                if (JobRepository.GetAllJobs().Count == 1)
                {
                    break;
                }
            }

            JobRepository.GetAllJobs().First().SentToWorkerNodeUri.Should().Be.EqualTo(_workerNode.Url.ToString());
        }
Exemplo n.º 3
0
        public void ShouldJustWarnIfAnotherManagerAlreadySentJob()
        {
            var jobQueueItem = new JobQueueItem
            {
                JobId      = Guid.NewGuid(),
                Name       = "Name",
                Serialized = "Serialized",
                Type       = "Type",
                CreatedBy  = "CreatedBy",
                Created    = DateTime.Now
            };

            NodeManager.AddWorkerNode(_workerNode.Url);

            using (var sqlConnection = new SqlConnection(ManagerConfiguration.ConnectionString))
            {
                sqlConnection.Open();
                JobRepositoryCommandExecuter.InsertIntoJobQueue(jobQueueItem, sqlConnection);
                JobRepositoryCommandExecuter.InsertIntoJob(jobQueueItem, "aNode", sqlConnection);
            }

            JobManager.AssignJobToWorkerNodes();
            var assertSQL = "SELECT COUNT(*) FROM Stardust.Logging WHERE [Level] = 'WARN' AND [Message] like '%It was already assigned, probably by another Manager.%'";

            using (var sqlConnection = new SqlConnection(ManagerConfiguration.ConnectionString))
            {
                using (var getAllJobsCommand = new SqlCommand(assertSQL, sqlConnection))
                {
                    sqlConnection.Open();
                    var ret = getAllJobsCommand.ExecuteScalar();
                    ret.Should().Be.EqualTo(1);
                }
            }
        }
Exemplo n.º 4
0
        public void ShouldHandleNodeDownTemporarilyOnPostAsync()
        {
            var jobQueueItem = new JobQueueItem
            {
                JobId      = Guid.NewGuid(),
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test"
            };

            WorkerNodeRepository.AddWorkerNode(_workerNode);
            JobManager.AddItemToJobQueue(jobQueueItem);
            FakeHttpSender.FailPostAsync = true;

            JobManager.AssignJobToWorkerNodes();
            JobRepository.GetAllItemsInJobQueue().Count.Should().Be(1);
            JobRepository.GetAllJobs().Count.Should().Be(0);
            Logger.InfoMessages.Any(l => l.Contains("The remote name could not be resolved")).Should().Be.True();
            Logger.ErrorMessages.Should().Be.Empty();
            Logger.InfoMessages.Clear();
            Logger.ErrorMessages.Clear();
            FakeHttpSender.FailPostAsync = false;

            JobManager.AssignJobToWorkerNodes();
            JobRepository.GetAllItemsInJobQueue().Count.Should().Be(0);
            JobRepository.GetAllJobs().Count.Should().Be(1);
        }
Exemplo n.º 5
0
        public void ShouldBeAbleToRequeueDeadJob()
        {
            var jobQueueItem = new JobQueueItem
            {
                JobId      = Guid.NewGuid(),
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test"
            };

            WorkerNodeRepository.AddWorkerNode(_workerNode);

            JobManager.AddItemToJobQueue(jobQueueItem);

            JobManager.AssignJobToWorkerNodes();

            var job = JobManager.GetJobByJobId(jobQueueItem.JobId);

            job.Satisfy(job1 => job1.Started != null);
            job.Satisfy(job1 => job1.Ended == null);

            NodeManager.RequeueJobsThatDidNotFinishedByWorkerNodeUri(job.SentToWorkerNodeUri);

            JobRepository.GetAllJobs().Count.Should().Be(0);
            JobRepository.GetAllItemsInJobQueue().Count.Should().Be(1);
        }
        public void duplicated_queue_item_should_start_queue_if_its_not_running()
        {
            IEnumerable <IJob> BaseFakeJobs = new List <IJob> {
                fakeJob
            };

            Mocker.SetConstant(BaseFakeJobs);

            var stuckQueueItem = new JobQueueItem
            {
                JobType = fakeJob.GetType(),
                Options = new { TargetId = 12 }
            };

            //Act
            var jobProvider = Mocker.Resolve <JobProvider>();

            jobProvider.Initialize();
            jobProvider.Queue.Add(stuckQueueItem);

            WaitForQueue();
            jobProvider.QueueJob(stuckQueueItem.JobType, stuckQueueItem.Options);
            WaitForQueue();

            //Assert
            fakeJob.ExecutionCount.Should().Be(1);
        }
Exemplo n.º 7
0
        public IHttpActionResult AddItemToJobQueue([FromBody] JobQueueItem jobQueueItem)
        {
            jobQueueItem.JobId = Guid.NewGuid();

            var isValidRequest = _validator.ValidateObject(jobQueueItem);

            if (!isValidRequest.Success)
            {
                return(BadRequest(isValidRequest.Message));
            }

            _jobManager.AddItemToJobQueue(jobQueueItem);

            var msg = $"{WhoAmI(Request)} : New job received from client ( jobId, jobName ) : ( {jobQueueItem.JobId}, {jobQueueItem.Name} )";

            this.Log().InfoWithLineNumber(msg);


            Task.Factory.StartNew(() =>
            {
                _jobManager.AssignJobToWorkerNodes();
            });

            return(Ok(jobQueueItem.JobId));
        }
Exemplo n.º 8
0
        public void ShouldNotBeAbleToSendAnotherQueuedJob_WhenCheckPolicy_AndHaveNotEnoughWorkerNode()
        {
            var jobQueueItem = new JobQueueItem
            {
                JobId      = Guid.NewGuid(),
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test",
                Policy     = HalfNodesAffinityPolicy.PolicyName
            };

            var jobQueueItem2 = new JobQueueItem
            {
                JobId      = Guid.NewGuid(),
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test",
                Policy     = HalfNodesAffinityPolicy.PolicyName
            };

            WorkerNodeRepository.AddWorkerNode(_workerNode);
            WorkerNodeRepository.AddWorkerNode(_workerNode2);

            JobManager.AddItemToJobQueue(jobQueueItem);
            JobManager.AddItemToJobQueue(jobQueueItem2);

            JobManager.AssignJobToWorkerNodes();

            JobRepository.GetAllItemsInJobQueue().Count.Should().Be(1);
            JobRepository.GetAllJobs().Count.Should().Be(1);
        }
Exemplo n.º 9
0
        public static List <JobQueueItem> GenerateFailingJobParamsRequests(int numberOfJobRequests)
        {
            List <JobQueueItem> requestModels = null;

            if (numberOfJobRequests > 0)
            {
                requestModels = new List <JobQueueItem>();

                for (var i = 1; i <= numberOfJobRequests; i++)
                {
                    var failingJobParams = new FailingJobParams("Error message " + i);

                    var failingJobParamsJson = JsonConvert.SerializeObject(failingJobParams);

                    var job = new JobQueueItem
                    {
                        Name       = "Job Name " + i,
                        Serialized = failingJobParamsJson,
                        Type       = "NodeTest.JobHandlers.FailingJobParams",
                        CreatedBy  = "Test"
                    };

                    requestModels.Add(job);
                }
            }
            return(requestModels);
        }
Exemplo n.º 10
0
        private async Task <string> AddJobAsync(JobQueueItem jobQueueItem)
        {
            var result  = HttpSender.PostAsync(MangerUriBuilder.GetAddToJobQueueUri(), jobQueueItem).Result;
            var content = await result.Content.ReadAsStringAsync();

            return(content);
        }
Exemplo n.º 11
0
        public void ShouldBeAbleToCancelJobIfStarted()
        {
            var jobQueueItem = new JobQueueItem
            {
                JobId      = Guid.NewGuid(),
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test"
            };

            WorkerNodeRepository.AddWorkerNode(_workerNode);

            JobManager.AddItemToJobQueue(jobQueueItem);

            JobManager.AssignJobToWorkerNodes();

            var job = JobManager.GetJobByJobId(jobQueueItem.JobId);

            job.Satisfy(job1 => job1.Started != null);

            JobManager.CancelJobByJobId(jobQueueItem.JobId);

            job = JobManager.GetJobByJobId(jobQueueItem.JobId);
            job.Satisfy(job1 => job1.Result.StartsWith("cancel", StringComparison.InvariantCultureIgnoreCase));

            JobRepository.GetAllJobs().Count.Should().Be(1);
        }
Exemplo n.º 12
0
        public Guid AddJob(JobQueueItem jobQueueItem)
        {
            string jobIdString = AddJobAsync(jobQueueItem).Result;
            Guid   jobId       = new Guid(JsonConvert.DeserializeObject <string>(jobIdString));

            return(jobId);
        }
Exemplo n.º 13
0
        public void InsertIntoJobQueue(JobQueueItem jobQueueItem, SqlConnection sqlConnection, SqlTransaction sqlTransaction = null)
        {
            const string insertIntoJobQueueCommandText = @"INSERT INTO [Stardust].[JobQueue]
							   ([JobId],
								[Name],
								[Type],
								[Serialized],
								[CreatedBy],
								[Created],
								[Policy])
							VALUES 
								(@JobId,
								 @Name,
								 @Type,
								 @Serialized,
								 @CreatedBy,
								 @Created,
								 @Policy)"                                ;

            using (var insertIntojobQueueCommand = new SqlCommand(insertIntoJobQueueCommandText, sqlConnection, sqlTransaction))
            {
                insertIntojobQueueCommand.Parameters.AddWithValue("@JobId", jobQueueItem.JobId);
                insertIntojobQueueCommand.Parameters.AddWithValue("@Name", jobQueueItem.Name);
                insertIntojobQueueCommand.Parameters.AddWithValue("@Type", jobQueueItem.Type);
                insertIntojobQueueCommand.Parameters.AddWithValue("@Serialized", jobQueueItem.Serialized);
                insertIntojobQueueCommand.Parameters.AddWithValue("@Created", DateTime.UtcNow);
                insertIntojobQueueCommand.Parameters.AddWithValue("@CreatedBy", jobQueueItem.CreatedBy);
                insertIntojobQueueCommand.Parameters.AddWithValue("@Policy", jobQueueItem.Policy);

                insertIntojobQueueCommand.ExecuteNonQueryWithRetry(_retryPolicy);
            }
        }
Exemplo n.º 14
0
        private void Execute(JobQueueItem queueItem)
        {
            var jobImplementation = _jobs.SingleOrDefault(t => t.GetType() == queueItem.JobType);

            if (jobImplementation == null)
            {
                logger.Error("Unable to locate implementation for '{0}'. Make sure it is properly registered.", queueItem.JobType);
                return;
            }

            var settings = All().Where(j => j.TypeName == queueItem.JobType.ToString()).Single();

            using (_notification = new ProgressNotification(jobImplementation.Name))
            {
                try
                {
                    logger.Debug("Starting {0}. Last execution {1}", queueItem, settings.LastExecution);

                    var sw = Stopwatch.StartNew();

                    _notificationProvider.Register(_notification);
                    jobImplementation.Start(_notification, queueItem.Options);
                    _notification.Status = ProgressNotificationStatus.Completed;

                    settings.LastExecution = DateTime.Now;
                    settings.Success       = true;

                    sw.Stop();
                    logger.Debug("Job {0} successfully completed in {1:0}.{2} seconds.", queueItem, sw.Elapsed.TotalSeconds, sw.Elapsed.Milliseconds / 100,
                                 sw.Elapsed.Seconds);
                }
                catch (ThreadAbortException)
                {
                    throw;
                }
                catch (Exception e)
                {
                    logger.ErrorException("An error has occurred while executing job [" + jobImplementation.Name + "].", e);
                    _notification.Status         = ProgressNotificationStatus.Failed;
                    _notification.CurrentMessage = jobImplementation.Name + " Failed.";

                    settings.LastExecution = DateTime.Now;
                    settings.Success       = false;
                }
            }

            //Only update last execution status if was triggered by the scheduler
            if (queueItem.Options == null)
            {
                SaveDefinition(settings);
            }
        }
Exemplo n.º 15
0
        private void ProcessQueue()
        {
            try
            {
                do
                {
                    using (NestedDiagnosticsContext.Push(Guid.NewGuid().ToString()))
                    {
                        try
                        {
                            JobQueueItem job = null;

                            lock (Queue)
                            {
                                if (Queue.Count != 0)
                                {
                                    job = Queue.OrderBy(c => c.Source).First();
                                    logger.Trace("Popping {0} from the queue.", job);
                                    Queue.Remove(job);
                                }
                            }

                            if (job != null)
                            {
                                Execute(job);
                            }
                        }
                        catch (ThreadAbortException)
                        {
                            throw;
                        }
                        catch (Exception e)
                        {
                            logger.FatalException("An error has occurred while executing job.", e);
                        }
                    }
                } while (Queue.Count != 0);
            }
            catch (ThreadAbortException e)
            {
                logger.Warn(e.Message);
            }
            catch (Exception e)
            {
                logger.ErrorException("Error has occurred in queue processor thread", e);
            }
            finally
            {
                StopWatch.Stop();
                logger.Trace("Finished processing jobs in the queue.");
            }
        }
        public void ShouldReturnBadRequestIfJobQueueItemHasInvalidCreatedByValue()
        {
            var jobQueueItem = new JobQueueItem
            {
                Name       = "Name",
                Serialized = "Serialized",
                Type       = "Type",
                CreatedBy  = string.Empty
            };

            var response = ManagerController.AddItemToJobQueue(jobQueueItem);

            Assert.IsInstanceOf(typeof(BadRequestErrorMessageResult), response);
        }
Exemplo n.º 17
0
        public void ShouldBeAbleToPersistNewJobQueueItem()
        {
            var jobQueueItem = new JobQueueItem
            {
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test"
            };

            ManagerController.AddItemToJobQueue(jobQueueItem);

            JobRepository.GetAllItemsInJobQueue().Count.Should().Be.EqualTo(1);
        }
        /// <summary>
        /// Long running task via BackgroundService
        /// </summary>
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                JobQueueItem jobQueueItem = null;
                try
                {
                    // wait for the queue to signal there is something that needs to be done
                    await _signal.WaitAsync(stoppingToken).ConfigureAwait(false);

                    // dequeue the item
                    jobQueueItem = _queue.TryDequeue(out var workItem) ? workItem : null;

                    if (jobQueueItem != null)
                    {
                        // put the job in to a "processing" state
                        await _jobStatusService.UpdateJobStatusAsync(
                            jobQueueItem.JobId, JobStatus.Processing).ConfigureAwait(false);

                        // the heavy lifting is done here...
                        var result = await _workService.DoWorkAsync(
                            jobQueueItem.JobId, jobQueueItem.JobParameters,
                            stoppingToken).ConfigureAwait(false);

                        // store the result of the work and set the status to "finished"
                        await _jobStatusService.StoreJobResultAsync(
                            jobQueueItem.JobId, result, JobStatus.Success).ConfigureAwait(false);
                    }
                }
                catch (TaskCanceledException)
                {
                    break;
                }
                catch (Exception ex)
                {
                    try
                    {
                        // something went wrong. Put the job in to an errored state and continue on
                        await _jobStatusService.StoreJobResultAsync(jobQueueItem.JobId, new JobResultModel
                        {
                            Exception = new JobExceptionModel(ex)
                        }, JobStatus.Errored).ConfigureAwait(false);
                    }
                    catch (Exception)
                    {
                        // TODO: log this
                    }
                }
            }
        }
        public void ShouldReturnBadRequestIfJobRequestModelNameIsNull()
        {
            var jobQueueItem = new JobQueueItem
            {
                Name       = null,
                Serialized = "Serialized",
                Type       = "Type",
                CreatedBy  = "UserName"
            };

            var response = ManagerController.AddItemToJobQueue(jobQueueItem);

            Assert.IsInstanceOf(typeof(BadRequestErrorMessageResult), response);
        }
Exemplo n.º 20
0
        public void ShouldBeAbleToAddToJobQueue()
        {
            var jobQueueItem = new JobQueueItem
            {
                JobId      = Guid.NewGuid(),
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test"
            };

            JobManager.AddItemToJobQueue(jobQueueItem);

            JobRepository.GetAllItemsInJobQueue().Count.Should().Be(1);
        }
Exemplo n.º 21
0
        private static JobQueueItem CreateJobQueueItemFromSqlDataReader(SqlDataReader sqlDataReader)
        {
            var jobQueueItem = new JobQueueItem
            {
                JobId      = sqlDataReader.GetGuid(sqlDataReader.GetOrdinal("JobId")),
                Name       = sqlDataReader.GetNullableString(sqlDataReader.GetOrdinal("Name")),
                Serialized = sqlDataReader.GetNullableString(sqlDataReader.GetOrdinal("Serialized")).Replace(@"\", @""),
                Type       = sqlDataReader.GetNullableString(sqlDataReader.GetOrdinal("Type")),
                CreatedBy  = sqlDataReader.GetNullableString(sqlDataReader.GetOrdinal("CreatedBy")),
                Created    = sqlDataReader.GetDateTime(sqlDataReader.GetOrdinal("Created")),
                Policy     = sqlDataReader.GetNullableString(sqlDataReader.GetOrdinal("Policy"))
            };

            return(jobQueueItem);
        }
Exemplo n.º 22
0
 public void AddItemToJobQueue(JobQueueItem jobQueueItem)
 {
     try
     {
         using (var sqlConnection = new SqlConnection(_connectionString))
         {
             sqlConnection.OpenWithRetry(_retryPolicy);
             _jobRepositoryCommandExecuter.InsertIntoJobQueue(jobQueueItem, sqlConnection);
         }
     }
     catch (Exception exp)
     {
         this.Log().ErrorWithLineNumber(exp.Message, exp);
         throw;
     }
 }
Exemplo n.º 23
0
        public void ShouldDeleteJobFromJobQueueIfNotAssignedToWorkerNode()
        {
            var jobQueueItem = new JobQueueItem
            {
                JobId      = Guid.NewGuid(),
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test"
            };

            JobManager.AddItemToJobQueue(jobQueueItem);

            JobManager.CancelJobByJobId(jobQueueItem.JobId);

            JobRepository.GetAllItemsInJobQueue().Count.Should().Be(0);
        }
Exemplo n.º 24
0
        public void ShouldDoNothing_WhenNoWorkerNodeExists_AndJobQueueHasItems()
        {
            var jobQueueItem = new JobQueueItem
            {
                JobId      = Guid.NewGuid(),
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test"
            };

            JobManager.AddItemToJobQueue(jobQueueItem);

            JobManager.AssignJobToWorkerNodes();

            FakeHttpSender.CallToWorkerNodes.Should().Be.Empty();
        }
Exemplo n.º 25
0
        public bool CheckPolicy(JobQueueItem jobQueueItem, List <Job> allExecutingJobs, int countOfAliveNodes)
        {
            ManagerLogger.Info($"Checking HalfNodesAffinityPolicy for job {jobQueueItem.JobId}");
            var totalNumberOfNodesCanRun = countOfAliveNodes / 2;

            if (jobQueueItem.Policy != PolicyName)
            {
                return(true);
            }
            var isSatisfied = allExecutingJobs.Count(x => x.Policy == PolicyName) < totalNumberOfNodesCanRun;

            if (!isSatisfied)
            {
                ManagerLogger.Info($"Failed HalfNodesAffinityPolicy for job {jobQueueItem.JobId}");
            }
            return(isSatisfied);
        }
Exemplo n.º 26
0
        public void ShouldReturnIdOfPersistedJob()
        {
            var jobQueueItem = new JobQueueItem
            {
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test"
            };

            IHttpActionResult actionResult =
                ManagerController.AddItemToJobQueue(jobQueueItem);

            var okNegotiatedContentResult = actionResult as OkNegotiatedContentResult <Guid>;
            var jobId = okNegotiatedContentResult.Content;

            jobId.Satisfy(guid => guid != Guid.Empty);
        }
Exemplo n.º 27
0
        public void ShouldAssignANewIdForANewQueueItem()
        {
            Guid oldGuid      = Guid.NewGuid();
            var  jobQueueItem = new JobQueueItem
            {
                JobId      = oldGuid,
                Name       = "Name",
                Serialized = "Serialized",
                Type       = "Type",
                CreatedBy  = "CreatedBy"
            };

            ManagerController.AddItemToJobQueue(jobQueueItem);

            var queuedItems = JobRepository.GetAllItemsInJobQueue();

            queuedItems[0].JobId.Should().Not.Be.EqualTo(oldGuid);
        }
Exemplo n.º 28
0
        public void InsertIntoJob(JobQueueItem jobQueueItem, string sentToWorkerNodeUri, SqlConnection sqlConnection, SqlTransaction sqlTransaction = null)
        {
            const string insertIntoJobCommandText = @"INSERT INTO [Stardust].[Job]
								   ([JobId]
								   ,[Name]
								   ,[Created]
								   ,[CreatedBy]
								   ,[Started]
								   ,[Ended]
								   ,[Serialized]
								   ,[Type]
								   ,[SentToWorkerNodeUri]
								   ,[Result]
								   ,[Policy])
							 VALUES
								   (@JobId
								   ,@Name
								   ,@Created
								   ,@CreatedBy
								   ,@Started
								   ,@Ended
								   ,@Serialized
								   ,@Type
								   ,@SentToWorkerNodeUri
								   ,@Result
								   ,@Policy)"                                ;

            using (var insertIntoJobCommand = new SqlCommand(insertIntoJobCommandText, sqlConnection, sqlTransaction))
            {
                insertIntoJobCommand.Parameters.AddWithValue("@Result", DBNull.Value);
                insertIntoJobCommand.Parameters.AddWithValue("@JobId", jobQueueItem.JobId);
                insertIntoJobCommand.Parameters.AddWithValue("@Name", jobQueueItem.Name);
                insertIntoJobCommand.Parameters.AddWithValue("@Type", jobQueueItem.Type);
                insertIntoJobCommand.Parameters.AddWithValue("@Serialized", jobQueueItem.Serialized);
                insertIntoJobCommand.Parameters.AddWithValue("@Started", DateTime.UtcNow);
                insertIntoJobCommand.Parameters.AddWithValue("@SentToWorkerNodeUri", sentToWorkerNodeUri);
                insertIntoJobCommand.Parameters.AddWithValue("@CreatedBy", jobQueueItem.CreatedBy);
                insertIntoJobCommand.Parameters.AddWithValue("@Created", jobQueueItem.Created);
                insertIntoJobCommand.Parameters.AddWithValue("@Ended", DBNull.Value);
                insertIntoJobCommand.Parameters.AddWithValue("@Policy", jobQueueItem.Policy ?? (object)DBNull.Value);
                insertIntoJobCommand.ExecuteNonQueryWithRetry(_retryPolicy);
            }
        }
Exemplo n.º 29
0
        public void ShouldBeAbleToSendAQueuedJob()
        {
            var jobQueueItem = new JobQueueItem
            {
                JobId      = Guid.NewGuid(),
                Name       = "Name Test",
                CreatedBy  = "Created By Test",
                Serialized = "Serialized Test",
                Type       = "Type Test"
            };

            WorkerNodeRepository.AddWorkerNode(_workerNode);

            JobManager.AddItemToJobQueue(jobQueueItem);

            JobManager.AssignJobToWorkerNodes();

            JobRepository.GetAllItemsInJobQueue().Count.Should().Be(0);
            JobRepository.GetAllJobs().Count.Should().Be(1);
        }
Exemplo n.º 30
0
        public void RequeueJobThatDidNotEndByWorkerNodeUri(string workerNodeUri)
        {
            try
            {
                lock (_requeueJobLock)
                {
                    using (var sqlConnection = new SqlConnection(_connectionString))
                    {
                        sqlConnection.OpenWithRetry(_retryPolicy);
                        using (var sqlTransaction = sqlConnection.BeginTransaction())
                        {
                            var job = _jobRepositoryCommandExecuter.SelectExecutingJob(workerNodeUri, sqlConnection, sqlTransaction);

                            if (job == null)
                            {
                                return;
                            }
                            var jobQueueItem = new JobQueueItem
                            {
                                Created    = job.Created,
                                CreatedBy  = job.CreatedBy,
                                JobId      = job.JobId,
                                Serialized = job.Serialized,
                                Name       = job.Name,
                                Type       = job.Type,
                                Policy     = job.Policy
                            };

                            _jobRepositoryCommandExecuter.InsertIntoJobQueue(jobQueueItem, sqlConnection, sqlTransaction);
                            _jobRepositoryCommandExecuter.DeleteJob(jobQueueItem.JobId, sqlConnection, sqlTransaction);
                            sqlTransaction.Commit();
                        }
                    }
                }
            }
            catch (Exception exp)
            {
                this.Log().ErrorWithLineNumber(exp.Message, exp);
                throw;
            }
        }
Exemplo n.º 31
0
        public void duplicated_queue_item_should_start_queue_if_its_not_running()
        {
            IList<IJob> BaseFakeJobs = new List<IJob> { fakeJob };
            Mocker.SetConstant(BaseFakeJobs);

            var stuckQueueItem = new JobQueueItem
                                    {
                                        JobType = fakeJob.GetType(),
                                        TargetId = 12,
                                        SecondaryTargetId = 0
                                    };

            //Act
            var jobProvider = Mocker.Resolve<JobProvider>();
            jobProvider.Initialize();
            jobProvider.Queue.Add(stuckQueueItem);

            WaitForQueue();
            jobProvider.QueueJob(stuckQueueItem.JobType, stuckQueueItem.TargetId, stuckQueueItem.SecondaryTargetId);
            WaitForQueue();

            //Assert
            fakeJob.ExecutionCount.Should().Be(1);
        }
Exemplo n.º 32
0
        private void Execute(JobQueueItem queueItem)
        {
            var jobImplementation = _jobs.Where(t => t.GetType() == queueItem.JobType).SingleOrDefault();
            if (jobImplementation == null)
            {
                logger.Error("Unable to locate implementation for '{0}'. Make sure it is properly registered.", queueItem.JobType);
                return;
            }

            var settings = All().Where(j => j.TypeName == queueItem.JobType.ToString()).Single();

            using (_notification = new ProgressNotification(jobImplementation.Name))
            {
                try
                {
                    logger.Debug("Starting {0}. Last execution {1}", queueItem, settings.LastExecution);

                    var sw = Stopwatch.StartNew();

                    _notificationProvider.Register(_notification);
                    jobImplementation.Start(_notification, queueItem.TargetId, queueItem.SecondaryTargetId);
                    _notification.Status = ProgressNotificationStatus.Completed;

                    settings.LastExecution = DateTime.Now;
                    settings.Success = true;

                    sw.Stop();
                    logger.Debug("Job {0} successfully completed in {1:0}.{2} seconds.", queueItem, sw.Elapsed.TotalSeconds, sw.Elapsed.Milliseconds / 100,
                                 sw.Elapsed.Seconds);
                }
                catch (ThreadAbortException)
                {
                    throw;
                }
                catch (Exception e)
                {
                    logger.ErrorException("An error has occurred while executing job [" + jobImplementation.Name + "].", e);
                    _notification.Status = ProgressNotificationStatus.Failed;
                    _notification.CurrentMessage = jobImplementation.Name + " Failed.";

                    settings.LastExecution = DateTime.Now;
                    settings.Success = false;
                }
            }

            //Only update last execution status if was triggered by the scheduler
            if (queueItem.TargetId == 0)
            {
                SaveDefinition(settings);
            }
        }
Exemplo n.º 33
0
        public virtual void QueueJob(Type jobType, int targetId = 0, int secondaryTargetId = 0, JobQueueItem.JobSourceType source = JobQueueItem.JobSourceType.User)
        {
            var queueItem = new JobQueueItem
            {
                JobType = jobType,
                TargetId = targetId,
                SecondaryTargetId = secondaryTargetId,
                Source = source
            };

            logger.Debug("Attempting to queue {0}", queueItem);

            lock (executionLock)
            {
                VerifyThreadTime();

                lock (Queue)
                {
                    if (!Queue.Contains(queueItem))
                    {
                        Queue.Add(queueItem);
                        logger.Trace("Job {0} added to the queue. current items in queue: {1}", queueItem, Queue.Count);
                    }
                    else
                    {
                        logger.Info("{0} already exists in the queue. Skipping. current items in queue: {1}", queueItem, Queue.Count);
                    }
                }

                if (_jobThread.IsAlive)
                {
                    logger.Trace("Queue is already running. No need to start it up.");
                    return;
                }

                ResetThread();
                StopWatch = Stopwatch.StartNew();
                _jobThread.Start();
            }

        }