public async Task ShouldNotRequeueWhenCommandMarkedAsCancelled()
        {
            // Arrange
            const string     testId  = "1234";
            ScheduledMessage message = new SimpleSchedulableCommand().CreateScheduledMessage(testId);

            _cancelledCommandRepository.TryRemoveCancelFlag(testId).Returns(true);

            // Act
            bool didReschedule = await _testSubject.Reschedule(message);

            // Assert
            Assert.False(didReschedule);
            await _queueClient.DidNotReceiveWithAnyArgs().SendAsync(new Message());
        }
示例#2
0
        public async Task <bool> Reschedule(ScheduledMessage message)
        {
            bool isMarkedAsCancelled = await _cancelledCommandRepository.TryRemoveCancelFlag(message.Id);

            if (isMarkedAsCancelled)
            {
                return(false);
            }

            if (message.Recurrence == ScheduledMessageRecurrenceEnum.DoesNotRecur)
            {
                return(false);
            }

            DateTime newScheduledAtUtc = _dateCalculator.NextScheduledAtUtc(message.ScheduledAtUtc, message.Recurrence);

            ScheduledMessage newMessage = new ScheduledMessage
            {
                Id = message.Id,
                LastExecutedAtUtc          = DateTime.UtcNow,
                LastScheduledAtUtc         = message.ScheduledAtUtc,
                Recurrence                 = message.Recurrence,
                ScheduledAtUtc             = newScheduledAtUtc,
                WrappedCommandFullTypeName = message.WrappedCommandFullTypeName,
                WrappedCommandJson         = message.WrappedCommandJson
            };

            IQueueClient queueClient  = _queueClientProvider.QueueClient;
            string       json         = JsonConvert.SerializeObject(newMessage);
            Message      queueMessage = new Message(Encoding.UTF8.GetBytes(json));

            queueMessage.MessageId = newMessage.Id;
            queueMessage.ScheduledEnqueueTimeUtc = newScheduledAtUtc;
            await queueClient.SendAsync(queueMessage); // this should be the very last thing we do

            return(true);
        }