/// <summary>
        /// Removes the timeout if it hasn't been previously removed.
        /// </summary>
        /// <param name="timeoutId">The timeout id to remove.</param>
        /// <param name="timeoutData">The timeout data of the removed timeout.</param>
        /// <returns>
        /// <c>true</c> it the timeout was successfully removed.
        /// </returns>
        public bool TryRemove(string timeoutId, out Timeout.Core.TimeoutData timeoutData)
        {
            timeoutData = null;

            var collection = this.mongoDatabase.GetCollection <TimeoutData>(TimeoutDataName);

            var findAndRemoveArgs = new FindAndRemoveArgs {
                Query = Query <TimeoutData> .EQ(t => t.Id, timeoutId)
            };
            var result = collection.FindAndRemove(findAndRemoveArgs);

            if (!result.Ok)
            {
                throw new InvalidOperationException(
                          string.Format("Unable to remove timeout for id {0}: {1}", timeoutId, result.ErrorMessage));
            }

            var data = result.GetModifiedDocumentAs <TimeoutData>();

            if (data != null)
            {
                timeoutData = new Timeout.Core.TimeoutData()
                {
                    Id                   = data.Id,
                    Destination          = data.Destination,
                    SagaId               = data.SagaId,
                    State                = data.State,
                    Time                 = data.Time,
                    Headers              = data.Headers,
                    OwningTimeoutManager = data.OwningTimeoutManager
                };
            }

            return(data != null);
        }
예제 #2
0
 public TimeoutData(Timeout.Core.TimeoutData data)
 {
     Destination          = data.Destination;
     SagaId               = data.SagaId;
     State                = data.State;
     Time                 = data.Time;
     OwningTimeoutManager = data.OwningTimeoutManager;
     Headers              = data.Headers;
 }
예제 #3
0
 public TimeoutDocument(string id, Timeout.Core.TimeoutData data)
 {
     Id                   = id;
     Destination          = data.Destination;
     SagaId               = data.SagaId;
     State                = data.State;
     Time                 = data.Time;
     OwningTimeoutManager = data.OwningTimeoutManager;
     Headers              = data.Headers;
 }
예제 #4
0
        public void RemoveTimeoutByIdOnEmptyTimeoutCollection(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeoutData)
        {
            factory.ResetTimeoutCollection();

            sut.RemoveTimeoutBy(timeoutData.SagaId);

            factory.RetrieveAllTimeouts().Should().HaveCount(0);
        }
예제 #5
0
        public void RemoveTimeoutByIdOnNonExistantIdDoesNotRemoveOtherTimeout(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeoutData)
        {
            factory.ResetTimeoutCollection();

            sut.Add(timeoutData);

            sut.RemoveTimeoutBy(Guid.NewGuid());

            factory.RetrieveAllTimeouts().Should().HaveCount(1);
        }
예제 #6
0
        public void AddOneTimeout(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeoutData)
        {
            factory.ResetTimeoutCollection();

            sut.Add(timeoutData);

            var result = factory.RetrieveAllTimeouts();

            result.Should().HaveCount(1);
        }
        public void RemoveTimeoutByIdRemovesTimeout(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeoutData,
            ContextBag context)
        {
            factory.ResetTimeoutCollection();

            sut.Add(timeoutData, context).Wait();

            sut.RemoveTimeoutBy(timeoutData.SagaId, context).Wait();

            factory.RetrieveAllTimeouts().Should().HaveCount(0);
        }
        public void PeekExistingTimeout(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeout1,
            ContextBag context)
        {
            factory.ResetTimeoutCollection();

            sut.Add(timeout1, context).Wait();
            var result = factory.RetrieveAllTimeouts().First();

            var peeked = sut.Peek(result.Id, context).Result;

            peeked.SagaId.Should().Be(timeout1.SagaId);
        }
        public void AddTwoDifferentTimeouts(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeout1,
            Timeout.Core.TimeoutData timeout2,
            ContextBag context)
        {
            factory.ResetTimeoutCollection();

            sut.Add(timeout1, context).Wait();
            sut.Add(timeout2, context).Wait();

            var result = factory.RetrieveAllTimeouts();

            result.Should().HaveCount(2);
        }
예제 #10
0
        public void GetNextChunkReturnsOneTimeoutWhenCollectionHasOneTimeout(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeoutData)
        {
            factory.ResetTimeoutCollection();

            timeoutData.Time = DateTime.UtcNow.AddMinutes(-1);
            sut.Add(timeoutData);

            var      startSlice = DateTime.UtcNow.AddMinutes(-5);
            DateTime nextTimeToRunQuery;
            var      result = sut.GetNextChunk(startSlice, out nextTimeToRunQuery);

            result.Should().HaveCount(1);
            nextTimeToRunQuery.Should().BeOnOrAfter(timeoutData.Time);
        }
        public void GetNextChunkReturnsOneTimeoutWhenCollectionHasOneTimeout(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeoutData,
            ContextBag context)
        {
            factory.ResetTimeoutCollection();

            timeoutData.Time = DateTime.UtcNow.AddMinutes(-1);
            sut.Add(timeoutData, context).Wait();

            var startSlice = DateTime.UtcNow.AddMinutes(-5);
            var result     = sut.GetNextChunk(startSlice).Result;

            result.DueTimeouts.Should().HaveCount(1);
            result.NextTimeToQuery.Should().BeOnOrAfter(timeoutData.Time);
        }
        public void TryRemoveShouldSucceedAndReturnData(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeoutData,
            ContextBag context)
        {
            factory.ResetTimeoutCollection();

            sut.Add(timeoutData, context).Wait();

            var timeouts = factory.RetrieveAllTimeouts();

            var result = sut.TryRemove(timeouts.First().Id, context).Result;

            result.Should().BeTrue();
            factory.RetrieveAllTimeouts().Should().HaveCount(0);
        }
예제 #13
0
        public void TryRemoveShouldSucceedAndReturnData(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeoutData)
        {
            factory.ResetTimeoutCollection();

            sut.Add(timeoutData);
            Timeout.Core.TimeoutData returnedTimeoutData;

            var timeouts = factory.RetrieveAllTimeouts();

            var result = sut.TryRemove(timeouts.First().Id.ToString(), out returnedTimeoutData);

            result.Should().BeTrue();
            returnedTimeoutData.ShouldBeEquivalentTo(timeoutData);

            factory.RetrieveAllTimeouts().Should().HaveCount(0);
        }
예제 #14
0
        public void RemoveTimeoutByIdRemovesCorrectTimeoutAndDoesNotRemoveOtherTimeout(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeoutData1,
            Timeout.Core.TimeoutData timeoutData2)
        {
            factory.ResetTimeoutCollection();

            sut.Add(timeoutData1);
            sut.Add(timeoutData2);

            sut.RemoveTimeoutBy(timeoutData2.SagaId);

            var remainingTimeouts = factory.RetrieveAllTimeouts().ToList();

            remainingTimeouts.Should().HaveCount(1);

            remainingTimeouts.First().SagaId.Should().Be(timeoutData1.SagaId);
        }
        /// <summary>
        /// Adds a new timeout.
        /// </summary>
        /// <param name="timeout">Timeout data.</param>
        /// <exception cref="InvalidOperationException">
        /// Throws exception if timeout is not saved.
        /// </exception>
        public void Add(Timeout.Core.TimeoutData timeout)
        {
            var data = new TimeoutData()
            {
                Id                   = Guid.NewGuid().ToString(),
                Destination          = timeout.Destination,
                SagaId               = timeout.SagaId,
                State                = timeout.State,
                Time                 = timeout.Time,
                Headers              = timeout.Headers,
                OwningTimeoutManager = timeout.OwningTimeoutManager
            };

            var collection = this.mongoDatabase.GetCollection <TimeoutData>(TimeoutDataName);
            var result     = collection.Save(data);

            if (result.HasLastErrorMessage)
            {
                throw new InvalidOperationException(string.Format("Unable to save timeout [{0}]", timeout));
            }

            timeout.Id = data.Id;
        }
        public void TryRemoveShouldSucceedAndReturnDataForOneTimeoutAndLeaveTheOther(
            MongoTimeoutPersister sut,
            MongoDatabaseFactory factory,
            Timeout.Core.TimeoutData timeoutData1,
            Timeout.Core.TimeoutData timeoutData2,
            ContextBag context)
        {
            factory.ResetTimeoutCollection();

            sut.Add(timeoutData1, context).Wait();
            sut.Add(timeoutData2, context).Wait();

            var timeouts = factory.RetrieveAllTimeouts();

            var result = sut.TryRemove(timeouts.First().Id, context).Result;

            result.Should().BeTrue();

            var remainingTimeout = factory.RetrieveAllTimeouts().ToList();

            remainingTimeout.Should().HaveCount(1);
            remainingTimeout.First().Id.Should().Be(timeouts.Last().Id);
        }
        /// <summary>
        /// Removes the timeout if it hasn't been previously removed.
        /// </summary>
        /// <param name="timeoutId">The timeout id to remove.</param>
        /// <param name="timeoutData">The timeout data of the removed timeout.</param>
        /// <returns>
        /// <c>true</c> it the timeout was successfully removed.
        /// </returns>
        public bool TryRemove(string timeoutId, out Timeout.Core.TimeoutData timeoutData)
        {
            timeoutData = null;

            var collection = this.mongoDatabase.GetCollection<TimeoutData>(TimeoutDataName);

            var findAndRemoveArgs = new FindAndRemoveArgs { Query = Query<TimeoutData>.EQ(t => t.Id, timeoutId) };
            var result = collection.FindAndRemove(findAndRemoveArgs);

            if (!result.Ok)
            {
                throw new InvalidOperationException(
                    string.Format("Unable to remove timeout for id {0}: {1}", timeoutId, result.ErrorMessage));
            }

            var data = result.GetModifiedDocumentAs<TimeoutData>();

            if (data != null)
            {
                timeoutData = new Timeout.Core.TimeoutData()
                                  {
                                      Id = data.Id,
                                      Destination = data.Destination,
                                      SagaId = data.SagaId,
                                      State = data.State,
                                      Time = data.Time,
                                      Headers = data.Headers,
                                      OwningTimeoutManager = data.OwningTimeoutManager
                                  };
            }

            return data != null;
        }