public void explicit_nak_with_park_correctly_tracks_the_available_client_slots() { var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .WithMaxRetriesOf(0) .WithMessageTimeoutOf(TimeSpan.Zero) .StartFromBeginning()); reader.Load(null); var corrid = Guid.NewGuid(); sub.AddClient(corrid, Guid.NewGuid(), envelope1, 1, "foo", "bar"); var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(id1, "type", "streamName", 0), Helper.BuildFakeEvent(id2, "type", "streamName", 1), Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamName", 2) }, 1, false); Assert.AreEqual(1, envelope1.Replies.Count); sub.NotAcknowledgeMessagesProcessed(corrid, new[] { id1 }, NakAction.Park, "a reason from client."); Assert.AreEqual(2, envelope1.Replies.Count); sub.NotAcknowledgeMessagesProcessed(corrid, new[] { id2 }, NakAction.Park, "a reason from client."); Assert.AreEqual(3, envelope1.Replies.Count); }
public void timeout_park_correctly_tracks_the_available_client_slots() { var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .WithMaxRetriesOf(0) .WithMessageTimeoutOf(TimeSpan.Zero) .StartFromBeginning()); reader.Load(null); sub.AddClient(Guid.NewGuid(), Guid.NewGuid(), envelope1, 2, "foo", "bar"); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamName", 0), Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamName", 1) }, 1, false); Assert.AreEqual(2, envelope1.Replies.Count); // Should expire first 2 and send to park. sub.NotifyClockTick(DateTime.Now.AddSeconds(1)); parker.ParkMessageCompleted(0, OperationResult.Success); parker.ParkMessageCompleted(1, OperationResult.Success); Assert.AreEqual(2, parker.ParkedEvents.Count); // The next 2 should still be sent to client. sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamName", 0), Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamName", 1) }, 1, false); Assert.AreEqual(4, envelope1.Replies.Count); }
public void explicit_nak_with_retry_retries_the_message() { var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .StartFromBeginning()); reader.Load(null); var corrid = Guid.NewGuid(); sub.AddClient(corrid, Guid.NewGuid(), envelope1, 10, "foo", "bar"); var id1 = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(id1, "type", "streamName", 0), }, 1, false); envelope1.Replies.Clear(); sub.NotAcknowledgeMessagesProcessed(corrid, new[] { id1 }, NakAction.Retry, "a reason from client."); Assert.AreEqual(1, envelope1.Replies.Count); Assert.AreEqual(id1, ((ClientMessage.PersistentSubscriptionStreamEventAppeared)envelope1.Replies[0]).Event.Event.EventId); Assert.AreEqual(0, parker.ParkedEvents.Count); }
public void multiple_messages_get_timed_out_and_parked_after_max_retry_count() { var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .PreferDispatchToSingle() .StartFromBeginning() .WithMaxRetriesOf(0) .WithMessageTimeoutOf(TimeSpan.FromSeconds(1))); reader.Load(null); sub.AddClient(Guid.NewGuid(), Guid.NewGuid(), envelope1, 10, "foo", "bar"); var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(id1, "type", "streamName", 0), Helper.BuildFakeEvent(id2, "type", "streamName", 1), }, 1, false); envelope1.Replies.Clear(); sub.NotifyClockTick(DateTime.Now.AddSeconds(3)); Assert.AreEqual(0, envelope1.Replies.Count); Assert.AreEqual(2, parker.ParkedEvents.Count); Assert.IsTrue(id1 == parker.ParkedEvents[0].OriginalEvent.EventId || id1 == parker.ParkedEvents[1].OriginalEvent.EventId); Assert.IsTrue(id2 == parker.ParkedEvents[0].OriginalEvent.EventId || id2 == parker.ParkedEvents[1].OriginalEvent.EventId); }
public void with_no_timeouts_to_happen_no_timeouts_happen() { var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .PreferDispatchToSingle() .StartFromBeginning() .WithMessageTimeoutOf(TimeSpan.FromSeconds(3))); reader.Load(null); sub.AddClient(Guid.NewGuid(), Guid.NewGuid(), envelope1, 10, "foo", "bar"); var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(id1, "type", "streamName", 0), Helper.BuildFakeEvent(id2, "type", "streamName", 1) }, 1, false); envelope1.Replies.Clear(); sub.NotifyClockTick(DateTime.Now.AddSeconds(1)); Assert.AreEqual(0, envelope1.Replies.Count); Assert.AreEqual(0, parker.ParkedEvents.Count); }
public void explicit_nak_with_retry_correctly_tracks_the_available_client_slots() { var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMaxRetriesOf(10) .WithMessageParker(parker) .StartFromBeginning()); reader.Load(null); var corrid = Guid.NewGuid(); sub.AddClient(corrid, Guid.NewGuid(), envelope1, 10, "foo", "bar"); var id1 = Guid.NewGuid(); var ev = Helper.BuildFakeEvent(id1, "type", "streamName", 0); sub.HandleReadCompleted(new[] { ev, }, 1, false); for (int i = 1; i < 11; i++) { sub.NotAcknowledgeMessagesProcessed(corrid, new[] { id1 }, NakAction.Retry, "a reason from client."); Assert.AreEqual(i + 1, envelope1.Replies.Count); } Assert.That(parker.ParkedEvents, Has.No.Member(ev)); //This time should be parked sub.NotAcknowledgeMessagesProcessed(corrid, new[] { id1 }, NakAction.Retry, "a reason from client."); Assert.AreEqual(11, envelope1.Replies.Count); Assert.That(parker.ParkedEvents, Has.Member(ev)); }
public void messages_dont_get_retried_when_acked_on_synchronous_reads() { var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .PreferDispatchToSingle() .StartFromBeginning() .WithMessageTimeoutOf(TimeSpan.FromSeconds(1))); reader.Load(null); var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(id1, "type", "streamName", 0), Helper.BuildFakeEvent(id2, "type", "streamName", 1) }, 1, false); sub.GetNextNOrLessMessages(2).ToArray(); sub.AcknowledgeMessagesProcessed(Guid.Empty, new[] { id1, id2 }); sub.NotifyClockTick(DateTime.Now.AddSeconds(3)); var retries = sub.GetNextNOrLessMessages(2).ToArray(); Assert.AreEqual(0, retries.Length); Assert.AreEqual(0, parker.ParkedEvents.Count); }
public void messages_get_timed_out_and_resent_to_clients() { var envelope1 = new FakeEnvelope(); var reader = new FakeCheckpointReader(); var parker = new FakeMessageParker(); var sub = new Core.Services.PersistentSubscription.PersistentSubscription( PersistentSubscriptionParamsBuilder.CreateFor("streamName", "groupName") .WithEventLoader(new FakeStreamReader(x => { })) .WithCheckpointReader(reader) .WithCheckpointWriter(new FakeCheckpointWriter(i => { })) .WithMessageParker(parker) .PreferDispatchToSingle() .StartFromBeginning() .WithMessageTimeoutOf(TimeSpan.FromSeconds(1))); reader.Load(null); sub.AddClient(Guid.NewGuid(), Guid.NewGuid(), envelope1, 1, "foo", "bar"); sub.AddClient(Guid.NewGuid(), Guid.NewGuid(), envelope1, 1, "foo", "bar"); var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); sub.HandleReadCompleted(new[] { Helper.BuildFakeEvent(id1, "type", "streamName", 0), Helper.BuildLinkEvent(id2, "streamName", 1, Helper.BuildFakeEvent(Guid.NewGuid(), "type", "streamSource", 0)) }, 1, false); envelope1.Replies.Clear(); sub.NotifyClockTick(DateTime.UtcNow.AddSeconds(3)); Assert.AreEqual(2, envelope1.Replies.Count); var msg1 = (Messages.ClientMessage.PersistentSubscriptionStreamEventAppeared)envelope1.Replies[0]; var msg2 = (Messages.ClientMessage.PersistentSubscriptionStreamEventAppeared)envelope1.Replies[1]; Assert.IsTrue(id1 == msg1.Event.OriginalEvent.EventId || id1 == msg2.Event.OriginalEvent.EventId); Assert.IsTrue(id2 == msg1.Event.OriginalEvent.EventId || id2 == msg2.Event.OriginalEvent.EventId); Assert.AreEqual(0, parker.ParkedEvents.Count); }