public void AddItemToJobQueue(JobQueueItem jobQueueItem) { try { Monitor.Enter(_lockAddItemToJobQueue); using (var sqlConnection = new SqlConnection(_connectionString)) { sqlConnection.OpenWithRetry(_retryPolicy); using (var sqlCommand = _createSqlCommandHelper.CreateInsertIntoJobQueueCommand(jobQueueItem, sqlConnection, null)) { sqlCommand.ExecuteNonQueryWithRetry(_retryPolicy); } } } catch (Exception exp) { this.Log().ErrorWithLineNumber(exp.Message, exp); throw; } finally { Monitor.Exit(_lockAddItemToJobQueue); } }
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); }
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); }
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); }
public void ShouldBeAbleToCancelJobOnNode() { var jobQueueItem = new JobQueueItem { JobId = Guid.NewGuid(), Name = "Name Test", CreatedBy = "Created By Test", Serialized = "Serialized Test", Type = "Type Test" }; NodeRepository.AddWorkerNode(_workerNode); JobRepository.AddItemToJobQueue(jobQueueItem); JobRepository.AssignJobToWorkerNode(); HttpSender.CallToWorkerNodes.Clear(); ManagerController.CancelJobByJobId(jobQueueItem.JobId); HttpSender.CallToWorkerNodes.Count().Should().Be.EqualTo(1); }
public void ShouldGetUniqueJobIdWhilePersistingJob() { var jobQueueItem1 = new JobQueueItem { Name = "Name1 Test", CreatedBy = "Created By Test", Serialized = "Serialized Test", Type = "Type Test" }; var jobQueueItem2 = new JobQueueItem { Name = "Name2 Test", CreatedBy = "Created By Test", Serialized = "Serialized Test", Type = "Type Test" }; ManagerController.AddItemToJobQueue(jobQueueItem1); ManagerController.AddItemToJobQueue(jobQueueItem2); var queuedItems = JobRepository.GetAllItemsInJobQueue(); queuedItems[0].Should().Not.Be.EqualTo(queuedItems[1]); }
public void ShouldReturnBadRequestIfJobRequestModelSerializedIsEmptyString() { var jobQueueItem = new JobQueueItem { Name = "Name", Serialized = string.Empty, Type = "Type", CreatedBy = "UserName" }; var response = ManagerController.AddItemToJobQueue(jobQueueItem); Assert.IsInstanceOf(typeof(BadRequestErrorMessageResult), response); }
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); }
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); }
private 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")) }; return jobQueueItem; }
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(new Uri(job.SentToWorkerNodeUri)); JobRepository.GetAllJobs().Count.Should().Be(0); JobRepository.GetAllItemsInJobQueue().Count.Should().Be(1); }
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); }
public void AddItemToJobQueue(JobQueueItem jobQueueItem) { _jobRepository.AddItemToJobQueue(jobQueueItem); }
public SqlCommand CreateInsertIntoJobCommand(JobQueueItem jobQueueItem, string sentToWorkerNodeUri, SqlConnection sqlConnection, SqlTransaction sqlTransaction) { var insertIntoJobCommandText = @"INSERT INTO [Stardust].[Job] ([JobId] ,[Name] ,[Created] ,[CreatedBy] ,[Started] ,[Ended] ,[Serialized] ,[Type] ,[SentToWorkerNodeUri] ,[Result]) VALUES (@JobId ,@Name ,@Created ,@CreatedBy ,@Started ,@Ended ,@Serialized ,@Type ,@SentToWorkerNodeUri ,@Result)"; var insertCommand = new SqlCommand(insertIntoJobCommandText, sqlConnection); insertCommand.Transaction = sqlTransaction; insertCommand.Parameters.AddWithValue("@JobId", jobQueueItem.JobId); insertCommand.Parameters.AddWithValue("@Name", jobQueueItem.Name); insertCommand.Parameters.AddWithValue("@Type", jobQueueItem.Type); insertCommand.Parameters.AddWithValue("@Serialized", jobQueueItem.Serialized); insertCommand.Parameters.AddWithValue("@Started", DateTime.UtcNow); insertCommand.Parameters.AddWithValue("@SentToWorkerNodeUri", sentToWorkerNodeUri); insertCommand.Parameters.AddWithValue("@CreatedBy", jobQueueItem.CreatedBy); insertCommand.Parameters.AddWithValue("@Created", jobQueueItem.Created); insertCommand.Parameters.AddWithValue("@Ended", DBNull.Value); return insertCommand; }
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); }
public SqlCommand CreateInsertIntoJobQueueCommand(JobQueueItem jobQueueItem, SqlConnection sqlConnection, SqlTransaction sqlTransaction) { const string insertIntoJobQueueCommandText = @"INSERT INTO [Stardust].[JobQueue] ([JobId], [Name], [Type], [Serialized], [CreatedBy], [Created]) VALUES (@JobId, @Name, @Type, @Serialized, @CreatedBy, @Created)"; var insertCommand = new SqlCommand(insertIntoJobQueueCommandText, sqlConnection); insertCommand.Transaction = sqlTransaction; insertCommand.Parameters.AddWithValue("@JobId", jobQueueItem.JobId); insertCommand.Parameters.AddWithValue("@Name", jobQueueItem.Name); insertCommand.Parameters.AddWithValue("@Type", jobQueueItem.Type); insertCommand.Parameters.AddWithValue("@Serialized", jobQueueItem.Serialized); insertCommand.Parameters.AddWithValue("@Created", DateTime.UtcNow); insertCommand.Parameters.AddWithValue("@CreatedBy", jobQueueItem.CreatedBy); return insertCommand; }
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); }
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()); }
public void ShouldRemoveAQueuedJobIfCancelled() { var jobQueueItem = new JobQueueItem { JobId = Guid.NewGuid(), Name = "Name Test", CreatedBy = "Created By Test", Serialized = "Serialized Test", Type = "Type Test" }; NodeRepository.AddWorkerNode(_workerNode); JobRepository.AddItemToJobQueue(jobQueueItem); JobRepository.AssignJobToWorkerNode(); ManagerController.CancelJobByJobId(jobQueueItem.JobId); JobRepository.GetAllItemsInJobQueue().Count.Should().Be.EqualTo(0); }
public void ShouldReturnBadRequestIfJobRequestModelUserNameIsNull() { var jobQueueItem = new JobQueueItem { Name = "Name", Serialized = "Serialized", Type = "Type", CreatedBy = null }; var response = ManagerController.AddItemToJobQueue(jobQueueItem); Assert.IsInstanceOf(typeof(BadRequestErrorMessageResult), response); }
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(); }
public void RequeueJobThatDidNotEndByWorkerNodeUri(string workerNodeUri) { try { using (var sqlConnection = new SqlConnection(_connectionString)) { sqlConnection.OpenWithRetry(_retryPolicy); using (var sqlTransaction = sqlConnection.BeginTransaction()) { Job job = null; using (var selectJobThatDidNotEndCommand = _createSqlCommandHelper.CreateSelectJobThatDidNotEndCommand(workerNodeUri, sqlConnection, sqlTransaction)) { using (var sqlDataReader = selectJobThatDidNotEndCommand.ExecuteReaderWithRetry(_retryPolicy)) { if (sqlDataReader.HasRows) { sqlDataReader.Read(); job = CreateJobFromSqlDataReader(sqlDataReader); } } } if (job != null) { var jobQueueItem = new JobQueueItem { Created = job.Created, CreatedBy = job.CreatedBy, JobId = job.JobId, Serialized = job.Serialized, Name = job.Name, Type = job.Type }; using (var insertIntojobQueueCommand = _createSqlCommandHelper.CreateInsertIntoJobQueueCommand(jobQueueItem, sqlConnection, sqlTransaction)) { insertIntojobQueueCommand.ExecuteNonQueryWithRetry(_retryPolicy); } using (var deleteJobByJobIdCommand = _createSqlCommandHelper.CreateDeleteJobByJobIdCommand(jobQueueItem.JobId, sqlConnection, sqlTransaction)) { deleteJobByJobIdCommand.ExecuteNonQueryWithRetry(_retryPolicy); } Retry(sqlTransaction.Commit); } } } } catch (Exception exp) { this.Log().ErrorWithLineNumber(exp.Message, exp); throw; } }
public void AddItemToJobQueue(JobQueueItem jobQueueItem) { _jobQueue.Add(jobQueueItem); }