public async Task CleanupTestTimeoutUpdateIndividualMessageTimeToLive(bool checkEntireQueueOnCleanup) { (IMessageStore messageStore, ICheckpointStore checkpointStore, InMemoryDbStore _)result = await this.GetMessageStore(checkEntireQueueOnCleanup, 20); result.messageStore.SetTimeToLive(TimeSpan.FromSeconds(20)); using (IMessageStore messageStore = result.messageStore) { for (int i = 0; i < 200; i++) { if (i % 2 == 0) { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module1", input, 20); CompareUpdatedMessageWithOffset(input, i / 2, updatedMessage); } else { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module2", input, 20); CompareUpdatedMessageWithOffset(input, i / 2, updatedMessage); } } IMessageIterator module1Iterator = messageStore.GetMessageIterator("module1"); IEnumerable <IMessage> batch = await module1Iterator.GetNext(100); Assert.Equal(100, batch.Count()); IMessageIterator module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Equal(100, batch.Count()); await Task.Delay(TimeSpan.FromSeconds(100)); module1Iterator = messageStore.GetMessageIterator("module1"); batch = await module1Iterator.GetNext(100); Assert.Empty(batch); module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Empty(batch); // By setting the global TTL for the MessageStore to 20, the CleanupProcessor will run every 10 seconds // But it won't clean up any messages, since the individual messages are set to have TTL of 2000 seconds result.messageStore.SetTimeToLive(TimeSpan.FromSeconds(20)); await Task.Delay(TimeSpan.FromSeconds(50)); for (int i = 0; i < 200; i++) { if (i % 2 == 0) { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module1", input, 2000); CompareUpdatedMessageWithOffset(input, 100 + i / 2, updatedMessage); } else { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module2", input, 50); CompareUpdatedMessageWithOffset(input, 100 + i / 2, updatedMessage); } } module1Iterator = messageStore.GetMessageIterator("module1"); batch = await module1Iterator.GetNext(100); Assert.Equal(100, batch.Count()); module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Equal(100, batch.Count()); await Task.Delay(TimeSpan.FromSeconds(100)); module1Iterator = messageStore.GetMessageIterator("module1", 100); batch = await module1Iterator.GetNext(100); Assert.Equal(100, batch.Count()); module2Iterator = messageStore.GetMessageIterator("module2", 100); batch = await module2Iterator.GetNext(100); Assert.Empty(batch); } }
public async Task CleanupTestTimeoutUpdateGlobalTimeToLive(bool checkEntireQueueOnCleanup) { (IMessageStore messageStore, ICheckpointStore checkpointStore, InMemoryDbStore _)result = await this.GetMessageStore(checkEntireQueueOnCleanup, 20); result.messageStore.SetTimeToLive(TimeSpan.FromSeconds(20)); using (IMessageStore messageStore = result.messageStore) { for (int i = 0; i < 200; i++) { if (i % 2 == 0) { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module1", input, 0); CompareUpdatedMessageWithOffset(input, i / 2, updatedMessage); } else { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module2", input, 0); CompareUpdatedMessageWithOffset(input, i / 2, updatedMessage); } } IMessageIterator module1Iterator = messageStore.GetMessageIterator("module1"); IEnumerable <IMessage> batch = await module1Iterator.GetNext(100); Assert.Equal(100, batch.Count()); IMessageIterator module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Equal(100, batch.Count()); await Task.Delay(TimeSpan.FromSeconds(100)); module1Iterator = messageStore.GetMessageIterator("module1"); batch = await module1Iterator.GetNext(100); Assert.Empty(batch); module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Empty(batch); result.messageStore.SetTimeToLive(TimeSpan.FromSeconds(2000)); await Task.Delay(TimeSpan.FromSeconds(50)); for (int i = 0; i < 200; i++) { if (i % 2 == 0) { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module1", input, 0); CompareUpdatedMessageWithOffset(input, 100 + i / 2, updatedMessage); } else { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module2", input, 0); CompareUpdatedMessageWithOffset(input, 100 + i / 2, updatedMessage); } } module1Iterator = messageStore.GetMessageIterator("module1"); batch = await module1Iterator.GetNext(100); Assert.Equal(100, batch.Count()); module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Equal(100, batch.Count()); await Task.Delay(TimeSpan.FromSeconds(100)); module1Iterator = messageStore.GetMessageIterator("module1"); batch = await module1Iterator.GetNext(100); Assert.Equal(100, batch.Count()); module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Equal(100, batch.Count()); } }
public async Task CleanupTestTimeoutWithRead() { (IMessageStore messageStore, ICheckpointStore checkpointStore)result = await this.GetMessageStore(20); using (IMessageStore messageStore = result.messageStore) { for (int i = 0; i < 200; i++) { if (i % 2 == 0) { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module1", input); CompareUpdatedMessageWithOffset(input, i / 2, updatedMessage); } else { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module2", input); CompareUpdatedMessageWithOffset(input, i / 2, updatedMessage); } } IMessageIterator module1Iterator = messageStore.GetMessageIterator("module1"); IEnumerable <IMessage> batch = await module1Iterator.GetNext(100); Assert.Equal(100, batch.Count()); IMessageIterator module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Equal(100, batch.Count()); await Task.Delay(TimeSpan.FromSeconds(100)); for (int i = 200; i < 250; i++) { if (i % 2 == 0) { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module1", input); CompareUpdatedMessageWithOffset(input, i / 2, updatedMessage); } else { IMessage input = this.GetMessage(i); IMessage updatedMessage = await messageStore.Add("module2", input); CompareUpdatedMessageWithOffset(input, i / 2, updatedMessage); } } module1Iterator = messageStore.GetMessageIterator("module1"); batch = await module1Iterator.GetNext(100); Assert.Equal(25, batch.Count()); module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Equal(25, batch.Count()); } }
public async Task MessageStoreAddRemoveEndpointTest() { // Arrange var dbStoreProvider = new InMemoryDbStoreProvider(); IStoreProvider storeProvider = new StoreProvider(dbStoreProvider); ICheckpointStore checkpointStore = CheckpointStore.Create(storeProvider); IMessageStore messageStore = new MessageStore(storeProvider, checkpointStore, TimeSpan.FromHours(1)); // Act await messageStore.AddEndpoint("module1"); for (int i = 0; i < 10; i++) { await messageStore.Add("module1", this.GetMessage(i)); } // Assert IMessageIterator module1Iterator = messageStore.GetMessageIterator("module1"); Assert.NotNull(module1Iterator); IEnumerable <IMessage> batch = await module1Iterator.GetNext(1000); List <IMessage> batchItemsAsList = batch.ToList(); Assert.Equal(10, batchItemsAsList.Count); for (int i = 0; i < 10; i++) { Assert.Equal($"{i}", batchItemsAsList.ElementAt(i).SystemProperties[SystemProperties.MessageId]); } // Remove await messageStore.RemoveEndpoint("module1"); // Assert await Assert.ThrowsAsync <InvalidOperationException>(() => messageStore.Add("module1", this.GetMessage(0))); Assert.Throws <InvalidOperationException>(() => messageStore.GetMessageIterator("module1")); // Act await messageStore.AddEndpoint("module1"); for (int i = 20; i < 30; i++) { await messageStore.Add("module1", this.GetMessage(i)); } // Assert module1Iterator = messageStore.GetMessageIterator("module1"); Assert.NotNull(module1Iterator); batch = await module1Iterator.GetNext(1000); batchItemsAsList = batch.ToList(); Assert.Equal(10, batchItemsAsList.Count); for (int i = 20; i < 30; i++) { Assert.Equal($"{i}", batchItemsAsList.ElementAt(i - 20).SystemProperties[SystemProperties.MessageId]); } }
public async Task CleanupTestTimeoutUpdateTimeToLive() { (IMessageStore messageStore, ICheckpointStore checkpointStore)result = await this.GetMessageStore(20); result.messageStore.SetTimeToLive(TimeSpan.FromSeconds(20)); using (IMessageStore messageStore = result.messageStore) { for (int i = 0; i < 200; i++) { if (i % 2 == 0) { long offset = await messageStore.Add("module1", this.GetMessage(i)); Assert.Equal(i / 2, offset); } else { long offset = await messageStore.Add("module2", this.GetMessage(i)); Assert.Equal(i / 2, offset); } } IMessageIterator module1Iterator = messageStore.GetMessageIterator("module1"); IEnumerable <IMessage> batch = await module1Iterator.GetNext(100); Assert.Equal(100, batch.Count()); IMessageIterator module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Equal(100, batch.Count()); await Task.Delay(TimeSpan.FromSeconds(100)); module1Iterator = messageStore.GetMessageIterator("module1"); batch = await module1Iterator.GetNext(100); Assert.Empty(batch); module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Empty(batch); result.messageStore.SetTimeToLive(TimeSpan.FromSeconds(2000)); await Task.Delay(TimeSpan.FromSeconds(50)); for (int i = 0; i < 200; i++) { if (i % 2 == 0) { long offset = await messageStore.Add("module1", this.GetMessage(i)); Assert.Equal(100 + i / 2, offset); } else { long offset = await messageStore.Add("module2", this.GetMessage(i)); Assert.Equal(100 + i / 2, offset); } } module1Iterator = messageStore.GetMessageIterator("module1"); batch = await module1Iterator.GetNext(100); Assert.Equal(100, batch.Count()); module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Equal(100, batch.Count()); await Task.Delay(TimeSpan.FromSeconds(100)); module1Iterator = messageStore.GetMessageIterator("module1"); batch = await module1Iterator.GetNext(100); Assert.Equal(100, batch.Count()); module2Iterator = messageStore.GetMessageIterator("module2"); batch = await module2Iterator.GetNext(100); Assert.Equal(100, batch.Count()); } }