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;
        }
示例#2
0
        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));
        }