private void OnTaskSubmittedMasterCommand(TaskSubmittedMasterCommand command) { Trace.WriteLine("ENTER: Handling task '{0}' request ...".FormatInvariant(command.TaskId)); ITaskRuntimeInfo taskInfo = this.repository.TaskRuntimeInfo.GetById(command.TaskId); if (taskInfo == null) { Trace.TraceWarning("EXIT: Task '{0}' not found.".FormatInvariant(command.TaskId)); return; } switch (taskInfo.Status) { case TaskStatus.Pending: break; case TaskStatus.Canceled: return; default: Trace.TraceWarning("EXIT: Task '{0}' status is '{1}'.".FormatInvariant(command.TaskId, taskInfo.Status)); return; } foreach (ITaskProcessorRuntimeInfo bestProcessor in this.taskDistributor.ChooseProcessorForTask(taskInfo)) { if (this.AssignTaskToProcessor(taskInfo.TaskId, taskInfo.TaskType, bestProcessor.TaskProcessorId)) { Trace.WriteLine("EXIT: Task '{0}' assigned to processor '{1}'.".FormatInvariant(command.TaskId, bestProcessor.TaskProcessorId)); return; } } this.repository.TaskRuntimeInfo.Assign(taskInfo.TaskId, null); Trace.TraceWarning("EXIT: All task processors failed to handle task '{0}' assignment.".FormatInvariant(command.TaskId)); }
private void SubmitTask(bool isPollingQueueTask, bool hasSummary, TaskPriority expectedPriority, Func <ITask, ITaskSummary, Guid> submitCallback) { this.DateTimeProvider.UtcNow = DateTime.UtcNow.AddMinutes(-1); FakeTask task1 = new FakeTask() { StringValue = "Hello Submit Task", NumberValue = 1234567 }; StringTaskSummary summary1; if (hasSummary) { summary1 = new StringTaskSummary("Hello World"); } this.Configuration.PredefineResult(isPollingQueueTask ? "Test" : null, c => c.GetPollingQueueKey(task1.GetType())); Guid taskId = submitCallback(task1, summary1); Assert.IsNotNull(this.TaskProcessorFacade.GetTask(taskId)); ITaskRuntimeInfo taskInfo = this.TaskProcessorFacade.GetTaskRuntimeInfo(taskId); Assert.IsNotNull(taskInfo); Assert.AreEqual(taskId, taskInfo.TaskId); Assert.AreEqual(expectedPriority, taskInfo.Priority); Assert.AreEqual(TaskStatus.Pending, taskInfo.Status); Assert.AreEqual(this.DateTimeProvider.UtcNow, taskInfo.SubmittedUtc); FakeTask task2 = (FakeTask)this.Repository.Tasks.GetById(taskId); UnitTestHelpers.AssertEqualByPublicScalarProperties(task1, task2); if (hasSummary) { StringTaskSummary summary2 = (StringTaskSummary)this.Repository.TaskSummary.GetById(taskId); Assert.AreEqual(summary1.Summary, summary2.Summary); } TaskSubmittedMasterCommand message = this.TaskProcessorFacade.MessageBus.MasterCommands .OfType <TaskSubmittedMasterCommand>() .SingleOrDefault(m => m.TaskId == taskId); if (isPollingQueueTask) { Assert.IsNull(message); Assert.IsTrue(this.Repository.TaskRuntimeInfo.GetPending(true).Any(p => p.TaskId == taskId)); Assert.IsTrue(this.Repository.TaskRuntimeInfo.ReservePollingQueueTasks("Test", int.MaxValue).Any(p => p.TaskId == taskId)); } else { Assert.IsNotNull(message); Assert.AreNotEqual(Guid.Empty, message.MessageUniqueId); Assert.AreEqual(taskId, message.TaskId); Assert.IsTrue(this.Repository.TaskRuntimeInfo.GetPending(false).Any(p => p.TaskId == taskId)); } }