Browse Source

Event consumer actor should handle old events.

pull/164/head
Sebastian Stehle 8 years ago
parent
commit
46f80f05b2
  1. 24
      src/Squidex.Infrastructure/CQRS/Events/Actors/EventConsumerActor.cs
  2. 20
      tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerActorTests.cs

24
src/Squidex.Infrastructure/CQRS/Events/Actors/EventConsumerActor.cs

@ -99,7 +99,12 @@ namespace Squidex.Infrastructure.CQRS.Events.Actors
return DoAndUpdateStateAsync(async () =>
{
await DispatchConsumerAsync(ParseEvent(storedEvent));
var @event = ParseKnownEvent(storedEvent);
if (@event != null)
{
await DispatchConsumerAsync(@event);
}
statusError = null;
statusPosition = storedEvent.EventPosition;
@ -296,14 +301,21 @@ namespace Squidex.Infrastructure.CQRS.Events.Actors
}
}
private Envelope<IEvent> ParseEvent(StoredEvent message)
private Envelope<IEvent> ParseKnownEvent(StoredEvent message)
{
var @event = formatter.Parse(message.Data);
try
{
var @event = formatter.Parse(message.Data);
@event.SetEventPosition(message.EventPosition);
@event.SetEventStreamNumber(message.EventStreamNumber);
@event.SetEventPosition(message.EventPosition);
@event.SetEventStreamNumber(message.EventStreamNumber);
return @event;
return @event;
}
catch (TypeNameNotFoundException)
{
return null;
}
}
}
}

20
tests/Squidex.Infrastructure.Tests/CQRS/Events/Actors/EventConsumerActorTests.cs

@ -185,6 +185,26 @@ namespace Squidex.Infrastructure.CQRS.Events.Actors
.MustHaveHappened(Repeated.Exactly.Once);
}
[Fact]
public async Task Should_ignore_old_events()
{
A.CallTo(() => formatter.Parse(eventData, true))
.Throws(new TypeNameNotFoundException());
var @event = new StoredEvent(Guid.NewGuid().ToString(), 123, eventData);
await OnSubscribeAsync();
await OnEventAsync(eventSubscription, @event);
sut.Dispose();
A.CallTo(() => eventConsumerInfoRepository.SetAsync(consumerName, @event.EventPosition, false, null))
.MustHaveHappened(Repeated.Exactly.Once);
A.CallTo(() => eventConsumer.On(envelope))
.MustNotHaveHappened();
}
[Fact]
public async Task Should_not_invoke_and_update_position_when_event_is_from_another_subscription()
{

Loading…
Cancel
Save