public void Handle(RescheduleTrickledMessages rescheduleTrickledMessages) { if (Data.LastUpdatingCommandRequestUtc != null && Data.LastUpdatingCommandRequestUtc > rescheduleTrickledMessages.MessageRequestTimeUtc) { return; } var trackingData = RavenScheduleDocuments.GetActiveScheduleTrackingData(Data.CoordinatorId); var messageResumeSpan = (rescheduleTrickledMessages.FinishTimeUtc.Ticks - rescheduleTrickledMessages.ResumeTimeUtc.Ticks); long messageOffset = 0; if (trackingData.Count > 1) { messageOffset = messageResumeSpan / (trackingData.Count - 1); } for (var i = 0; i < trackingData.Count; i++) { var resumeScheduledMessageWithOffset = new RescheduleScheduledMessageWithNewTime(trackingData[i].ScheduleId, new DateTime(rescheduleTrickledMessages.ResumeTimeUtc.Ticks + (i * messageOffset), DateTimeKind.Utc)); Bus.Send(resumeScheduledMessageWithOffset); } Data.LastUpdatingCommandRequestUtc = rescheduleTrickledMessages.MessageRequestTimeUtc; }
public void RescheduleWithStartAndFinishTime() { var bus = MockRepository.GenerateMock <IBus>(); var dateTimeMapper = MockRepository.GenerateMock <IDateTimeUtcFromOlsenMapping>(); var context = MockRepository.GenerateMock <ControllerContext>(); var httpSessionStateBase = MockRepository.GenerateStub <HttpSessionStateBase>(); var coordinatorController = new CoordinatorController { Bus = bus, DateTimeOlsenMapping = dateTimeMapper, ControllerContext = context }; var timeToResume = DateTime.Now; var timeToFinish = DateTime.Now.AddMinutes(44); var coordinatorId = Guid.NewGuid(); var collection = new FormCollection { { "CoordinatorId", coordinatorId.ToString() }, { "timeToResume", DateTime.Now.AddMinutes(20).ToString() }, { "finishTime", DateTime.Now.AddMinutes(30).ToString() }, { "UserTimeZone", "MadeUpLand" } }; RescheduleTrickledMessages rescheduleMessage = null; bus .Expect(b => b.Send(Arg <RescheduleTrickledMessages> .Is.Anything)) .WhenCalled(b => rescheduleMessage = (RescheduleTrickledMessages)(b.Arguments[0])); dateTimeMapper .Expect(d => d.DateTimeWithOlsenZoneToUtc(DateTime.Parse(collection["timeToResume"]), collection["UserTimeZone"])) .Return(timeToResume); dateTimeMapper .Expect(d => d.DateTimeWithOlsenZoneToUtc(DateTime.Parse(collection["finishTime"]), collection["UserTimeZone"])) .Return(timeToFinish); context.Expect(c => c.HttpContext.Session).Return(httpSessionStateBase); var result = (RedirectToRouteResult)coordinatorController.Resume(collection); Assert.That(result.RouteValues["action"], Is.EqualTo("Details")); Assert.That(rescheduleMessage.CoordinatorId, Is.EqualTo(coordinatorId)); Assert.That(rescheduleMessage.ResumeTimeUtc, Is.EqualTo(timeToResume)); Assert.That(rescheduleMessage.FinishTimeUtc, Is.EqualTo(timeToFinish)); bus.VerifyAllExpectations(); }
public void TrickleMessagesRescheduleMessageSending_Data() { var ravenScheduleDocuments = MockRepository.GenerateMock <IRavenScheduleDocuments>(); var dateTime = DateTime.Now; var finishTime = dateTime.AddMinutes(9); var sagaId = Guid.NewGuid(); var sagaData = new CoordinateSmsSchedulingData { Originator = "o", OriginalScheduleStartTime = dateTime.AddMinutes(-5), CoordinatorId = sagaId }; var pausedTrackedMessages = new List <ScheduleTrackingData> { new ScheduleTrackingData { MessageStatus = MessageStatus.Paused, ScheduleId = Guid.NewGuid() }, new ScheduleTrackingData { MessageStatus = MessageStatus.Paused, ScheduleId = Guid.NewGuid() } }; ravenScheduleDocuments.Expect(r => r.GetActiveScheduleTrackingData(sagaId)).Return(pausedTrackedMessages); var rescheduleTrickledMessages = new RescheduleTrickledMessages { ResumeTimeUtc = dateTime, FinishTimeUtc = finishTime }; Test.Initialize(); Test.Saga <CoordinateSmsScheduler>() .WithExternalDependencies(s => { s.Data = sagaData; s.RavenScheduleDocuments = ravenScheduleDocuments; }) .ExpectSend <RescheduleScheduledMessageWithNewTime>( l => l.ScheduleMessageId == pausedTrackedMessages[0].ScheduleId && l.NewScheduleTimeUtc.Equals(dateTime)) .ExpectSend <RescheduleScheduledMessageWithNewTime>( l => l.ScheduleMessageId == pausedTrackedMessages[1].ScheduleId && l.NewScheduleTimeUtc.Equals(finishTime)) .When(s => s.Handle(rescheduleTrickledMessages)); }