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 Handle(RescheduleScheduledMessageWithNewTime message)
 {
     if (Data.LastUpdateCommandRequestUtc != null && Data.LastUpdateCommandRequestUtc > message.MessageRequestTimeUtc)
     {
         return;
     }
     Data.SchedulingPaused = false;
     Data.TimeoutCounter++;
     RequestUtcTimeout(message.NewScheduleTimeUtc, new ScheduleEmailTimeout {
         TimeoutCounter = Data.TimeoutCounter
     });
     Bus.SendLocal(new ScheduleStatusChanged
     {
         RequestTimeUtc  = message.MessageRequestTimeUtc,
         ScheduleId      = message.ScheduleMessageId,
         Status          = MessageStatus.Scheduled,
         ScheduleTimeUtc = message.NewScheduleTimeUtc
     });
     Bus.Publish(new MessageRescheduled
     {
         CoordinatorId      = Data.OriginalMessageData.RequestingCoordinatorId,
         ScheduleMessageId  = Data.ScheduleMessageId,
         RescheduledTimeUtc = message.NewScheduleTimeUtc,
         // TODO : Should we remove the number or have a different thing for emails?
     });
     Data.LastUpdateCommandRequestUtc = message.MessageRequestTimeUtc;
 }
예제 #3
0
        public void ReschedulePausedSchedule_Data()
        {
            var sagaId            = Guid.NewGuid();
            var scheduleMessageId = Guid.NewGuid();

            var scheduledEmailData = new ScheduledEmailData
            {
                Id = sagaId,
                ScheduleMessageId   = scheduleMessageId,
                Originator          = "place",
                OriginalMessageId   = Guid.NewGuid().ToString(),
                OriginalMessageData = new OriginalEmailMessageData(new ScheduleEmailForSendingLater {
                    EmailData = new EmailData(), SendMessageAtUtc = DateTime.Now
                })
            };

            Test.Initialize();
            var rescheduleMessage = new RescheduleScheduledMessageWithNewTime(scheduleMessageId, new DateTime(2040, 4, 4, 4, 4, 4, DateTimeKind.Utc));

            Test.Saga <EmailScheduler>()
            .WithExternalDependencies(a => { a.Data = scheduledEmailData; })
            .ExpectTimeoutToBeSetAt <ScheduleEmailTimeout>((state, span) => span == rescheduleMessage.NewScheduleTimeUtc)
            .ExpectPublish <MessageRescheduled>()
            .When(s => s.Handle(rescheduleMessage));

            Assert.IsFalse(scheduledEmailData.SchedulingPaused);
        }