public void Event_saving_smoke_test() { var targetStore = new RavenDBEventStore(_documentStore); var id = Guid.NewGuid(); int sequenceCounter = 0; var events = new UncommittedEventStream(Guid.NewGuid()); events.Append(new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerCreatedEvent("Foo", 35), new Version(1, 0))); events.Append(new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged( "Name" + sequenceCounter), new Version(1, 0))); events.Append(new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged( "Name" + sequenceCounter), new Version(1, 0))); events.Append(new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged( "Name" + sequenceCounter), new Version(1, 0))); targetStore.Store(events); }
public void Retrieving_all_events_should_return_the_same_as_added() { var id=Guid.NewGuid(); var sequenceCounter=0; var stream = new UncommittedEventStream(Guid.NewGuid()); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerCreatedEvent("Foo", 35), new Version(1, 0))); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged("Name" + sequenceCounter), new Version(1, 0))); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged("Name" + sequenceCounter), new Version(1, 0))); _store.Store(stream); var result=_store.ReadFrom(id, long.MinValue, long.MaxValue); result.Count().Should().Be(stream.Count()); result.First().EventIdentifier.Should().Be(stream.First().EventIdentifier); //TODO: var streamList = stream.ToList(); var resultList = result.ToList(); for (int i = 0; i < resultList.Count; i++) { Assert.IsTrue(AreEqual(streamList[i], resultList[i])); } }
public void When_contains_multpile_events_from_different_sources_should_indicate_non_single_source() { var sut = new UncommittedEventStream(Guid.NewGuid()); sut.Append(CreateEvent(Guid.NewGuid())); sut.Append(CreateEvent(Guid.NewGuid())); Assert.IsFalse(sut.HasSingleSource); }
public void Retrieving_all_events_should_return_the_same_as_added() { var id = Guid.NewGuid(); var sequenceCounter = 0; var stream = new UncommittedEventStream(Guid.NewGuid()); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerCreatedEvent("Foo", 35), new Version(1, 0))); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged("Name" + sequenceCounter), new Version(1, 0))); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged("Name" + sequenceCounter), new Version(1, 0))); _store.Store(stream); var result = _store.ReadFrom(id, long.MinValue, long.MaxValue); result.Count().Should().Be(stream.Count()); result.First().EventIdentifier.Should().Be(stream.First().EventIdentifier); //TODO: var streamList = stream.ToList(); var resultList = result.ToList(); for (int i = 0; i < resultList.Count; i++) { Assert.IsTrue(AreEqual(streamList[i], resultList[i])); } }
public void When_contains_multpile_events_from_same_source_should_indicate_a_single_source() { var sut = new UncommittedEventStream(Guid.NewGuid()); var eventSourceId = Guid.NewGuid(); sut.Append(CreateEvent(eventSourceId)); sut.Append(CreateEvent(eventSourceId)); Assert.IsTrue(sut.HasSingleSource); }
public void Retrieved_event_should_having_identical_timestamp_as_persisted() { var id = Guid.NewGuid(); var utcNow = DateTime.UtcNow.Date.AddHours(9).AddTicks(-1); var stream = new UncommittedEventStream(Guid.NewGuid()); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, typeof(object), 1, 0, utcNow, new CustomerCreatedEvent("Foo", 35), new Version(1, 0))); _store.Store(stream); using (var conn = new SQLiteConnection(_connString)) { conn.Open(); using (var cmd = new SQLiteCommand("SELECT [TimeStamp] FROM [Events]", conn)) using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var timestamp = (long)reader["Timestamp"]; timestamp.Should().Be(utcNow.Ticks); } } } }
public void Rolling_back_transaction_should_remove_inserted_rows() { var id = Guid.NewGuid(); var utcNow = DateTime.UtcNow.Date.AddHours(9).AddTicks(-1); var stream = new UncommittedEventStream(Guid.NewGuid()); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, 1, 0, utcNow, new CustomerCreatedEvent("Foo", 35), new Version(1, 0))); _store.Store(stream); _transaction.Rollback(); using (var conn = new SQLiteConnection(_connString)) { conn.Open(); using (var cmd = new SQLiteCommand("SELECT [TimeStamp] FROM [Events]", conn)) using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { Assert.Fail("No rows should exist"); } } } }
public void Retrieved_event_should_having_identical_timestamp_as_persisted() { var id = Guid.NewGuid(); var utcNow = DateTime.UtcNow.Date.AddHours(9).AddTicks(-1); var stream = new UncommittedEventStream(Guid.NewGuid()); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, 1, 0, utcNow, new CustomerCreatedEvent("Foo", 35), new Version(1, 0))); _store.Store(stream); using (var conn = new SQLiteConnection(_connString)) { conn.Open(); using (var cmd = new SQLiteCommand("SELECT [TimeStamp] FROM [Events]", conn)) using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { var timestamp = (long)reader["Timestamp"]; timestamp.Should().Be(utcNow.Ticks); } } } }
protected override void AggregateRootEventAppliedHandler(AggregateRoot aggregateRoot, UncommittedEvent evnt) { var message = new EventMessage { Body = new StoredEvent { Body = evnt.Payload, CommitId = _commitId, EventId = evnt.EventIdentifier, MajorVersion = evnt.EventVersion.Major, MinorVersion = evnt.EventVersion.Minor, Sequence = evnt.EventSequence, TimeStamp = evnt.EventTimeStamp } }; IEventStream stream; var id = aggregateRoot.EventSourceId; if (!_trackedStreams.TryGetValue(id, out stream)) { stream = _eventStore.CreateStream(id); _trackedStreams[id] = stream; } stream.Add(message); _eventStream.Append(evnt); _dirtyInstances.Add(aggregateRoot); }
private UncommittedEventStream BuildStream(Guid commitId, IEnumerable<UncommittedEvent> events) { var stream = new UncommittedEventStream(commitId); foreach (var evnt in events) stream.Append(evnt); return stream; }
public void When_contains_single_event_should_indicate_a_single_source() { var sut = new UncommittedEventStream(Guid.NewGuid()); sut.Append(new UncommittedEvent(Guid.NewGuid(), Guid.NewGuid(), 0, 0, DateTime.UtcNow, new object(), new Version(1, 0))); Assert.IsTrue(sut.HasSingleSource); }
public void Process(CaseReported @event) { var caseReport = _caseReports.GetById(@event.Id); if (caseReport == null) { caseReport = new CaseReport { Id = @event.Id, DataCollectorId = @event.DataCollectorId, HealthRiskId = @event.HealthRiskId, Location = @event.Location, SubmissionTimestamp = @event.CaseOccured }; } else { caseReport.Id = @event.Id; caseReport.DataCollectorId = @event.DataCollectorId; caseReport.HealthRiskId = @event.HealthRiskId; caseReport.Location = @event.Location; caseReport.SubmissionTimestamp = @event.CaseOccured; } _caseReports.Save(caseReport); var disease = _healthRisks.GetById(caseReport.HealthRiskId) ?? new HealthRisk { Id = @event.HealthRiskId, ThresholdTimePeriodInDays = 7, ThresholdNumberOfCases = 3 }; var latestReports = _caseReports.GetCaseReportsAfterDate( DateTime.UtcNow.Subtract(TimeSpan.FromDays(disease.ThresholdTimePeriodInDays)), caseReport.HealthRiskId); if (latestReports.Count > disease.ThresholdNumberOfCases) { var alert = _alerts.Get(caseReport.HealthRiskId, caseReport.Location); if (alert == null) { alert = new Alert { Id = Guid.NewGuid(), HealthRiskId = caseReport.HealthRiskId, Location = caseReport.Location, }; } alert.CaseReports.Add(caseReport); _alerts.Save(alert); // Todo: Temporary fix - we're not supposed to do this, awaiting the new Policy building block in doLittle to be ready var stream = new UncommittedEventStream(null); stream.Append(new AlertRaised(), EventSourceVersion.Zero.NextCommit()); _uncommittedEventStreamCoordinator.Commit(TransactionCorrelationId.New(), stream); _feedbackService.SendFeedbackToDataCollecorsAndVerifiers(latestReports); } }
void ApplyEvent(IEvent @event) { // Todo: Temporary fix - we're not supposed to do this, awaiting the new Policy building block in doLittle to be ready var stream = new UncommittedEventStream(null); stream.Append(@event, EventSourceVersion.Zero.NextCommit()); _uncommittedEventStreamCoordinator.Commit(TransactionCorrelationId.New(), stream); }
public void Save_SmokeTest() { var sequenceCounter = 0; var id=Guid.NewGuid(); var stream = new UncommittedEventStream(Guid.NewGuid()); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerCreatedEvent("Foo", 35), new Version(1, 0))); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged("Name" + sequenceCounter), new Version(1, 0))); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged("Name" + sequenceCounter), new Version(1, 0))); _store.Store(stream); }
public void Save_SmokeTest() { var sequenceCounter = 0; var id = Guid.NewGuid(); var stream = new UncommittedEventStream(Guid.NewGuid()); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerCreatedEvent("Foo", 35), new Version(1, 0))); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged("Name" + sequenceCounter), new Version(1, 0))); stream.Append( new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged("Name" + sequenceCounter), new Version(1, 0))); _store.Store(stream); _transaction.Commit(); }
private UncommittedEventStream BuildStream(Guid commitId, IEnumerable <UncommittedEvent> events) { var stream = new UncommittedEventStream(commitId); foreach (var evnt in events) { stream.Append(evnt); } return(stream); }
private static void GenerateEvents() { var eventStore = new MsSqlServerEventStore(ConfigurationManager.ConnectionStrings["Main"].ConnectionString); for (int i = 0; i < 1000; i++) { var uncommittedEventStream = new UncommittedEventStream(Guid.NewGuid()); uncommittedEventStream.Append(new UncommittedEvent(Guid.NewGuid(), Guid.NewGuid(), i, i, DateTime.Now, new object(), new Version(1, 0))); eventStore.Store(uncommittedEventStream); } }
public void When_getting_all_event_from_an_existing_event_source_the_result_should_be_all_events_stored_for_that_event_source() { var eventSourceId = Guid.NewGuid(); var stream1 = new UncommittedEventStream(Guid.NewGuid()); stream1.Append(new UncommittedEvent(Guid.NewGuid(), eventSourceId, typeof(object), 1, 0, DateTime.UtcNow, new object(), new Version(1, 0))); stream1.Append(new UncommittedEvent(Guid.NewGuid(), eventSourceId, typeof(object), 2, 0, DateTime.UtcNow, new object(), new Version(1, 0))); var stream2 = new UncommittedEventStream(Guid.NewGuid()); stream2.Append(new UncommittedEvent(Guid.NewGuid(), eventSourceId, typeof(object), 3, 1, DateTime.UtcNow, new object(), new Version(1, 0))); stream2.Append(new UncommittedEvent(Guid.NewGuid(), eventSourceId, typeof(object), 4, 1, DateTime.UtcNow, new object(), new Version(1, 0))); stream2.Append(new UncommittedEvent(Guid.NewGuid(), eventSourceId, typeof(object), 5, 1, DateTime.UtcNow, new object(), new Version(1, 0))); var store = new InMemoryEventStore(); store.Store(stream1); store.Store(stream2); var events = store.ReadFrom(eventSourceId, typeof(object), long.MinValue, long.MaxValue); events.Count().Should().Be(5); }
public void Saving_event_source_while_there_is_a_newer_event_source_should_throw_concurency_exception() { var targetStore = new RavenDBEventStore(_documentStore); var id = Guid.NewGuid(); int sequenceCounter = 0; var events = new UncommittedEventStream(Guid.NewGuid()); events.Append(new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerCreatedEvent("Foo", 35), new Version(1, 0))); events.Append(new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged( "Name" + sequenceCounter), new Version(1, 0))); targetStore.Store(events); Action act = () => targetStore.Store(events); act.ShouldThrow <ConcurrencyException>(); }
public void When_getting_all_event_from_an_existing_event_source_the_result_should_be_all_events_stored_for_that_event_source() { var eventSourceId = Guid.NewGuid(); var stream1 = new UncommittedEventStream(Guid.NewGuid()); stream1.Append(new UncommittedEvent(Guid.NewGuid(), eventSourceId, 1, 0, DateTime.UtcNow, new object(), new Version(1, 0))); stream1.Append(new UncommittedEvent(Guid.NewGuid(), eventSourceId, 2, 0, DateTime.UtcNow, new object(), new Version(1, 0))); var stream2 = new UncommittedEventStream(Guid.NewGuid()); stream2.Append(new UncommittedEvent(Guid.NewGuid(), eventSourceId, 3, 1, DateTime.UtcNow, new object(), new Version(1, 0))); stream2.Append(new UncommittedEvent(Guid.NewGuid(), eventSourceId, 4, 1, DateTime.UtcNow, new object(), new Version(1, 0))); stream2.Append(new UncommittedEvent(Guid.NewGuid(), eventSourceId, 5, 1, DateTime.UtcNow, new object(), new Version(1, 0))); var store = new InMemoryEventStore(); store.Store(stream1); store.Store(stream2); var events = store.ReadFrom(eventSourceId, long.MinValue, long.MaxValue); events.Count().Should().Be(5); }
private static void GenerateEventsForAggregateRoots() { const int aggregateRootCount = 10; var aggregateRoots = Enumerable.Range(0, aggregateRootCount).Select(x => Guid.NewGuid()).ToList(); var random = new Random(); var eventStore = new MsSqlServerEventStore(ConfigurationManager.ConnectionStrings["Main"].ConnectionString); for (int i = 0; i < 1000; i++) { Guid rootId = aggregateRoots[random.Next(aggregateRootCount)]; var uncommittedEventStream = new UncommittedEventStream(Guid.NewGuid()); uncommittedEventStream.Append(new UncommittedEvent(Guid.NewGuid(), rootId, i, i, DateTime.Now, new object(), new Version(1, 0))); } }
public void SaveUncommittedEventsToEventStore(IEventStore eventStore) { foreach (var aggregatedRootId in _aggregatedRootEvents.Keys) { var events = _aggregatedRootEvents[aggregatedRootId]; var uncommittedEventStream = new UncommittedEventStream(aggregatedRootId); foreach (var @event in events) { uncommittedEventStream.Append(@event); } eventStore.Commit(uncommittedEventStream); } }
public void Retrieving_all_events_should_return_the_same_as_added() { var targetStore = new RavenDBEventStore(_documentStore); var id = Guid.NewGuid(); int sequenceCounter = 0; var events = new UncommittedEventStream(Guid.NewGuid()); events.Append(new UncommittedEvent(Guid.NewGuid(), id, typeof(object), sequenceCounter++, 0, DateTime.UtcNow, new CustomerCreatedEvent("Foo", 35), new Version(1, 0))); events.Append(new UncommittedEvent(Guid.NewGuid(), id, typeof(object), sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged( "Name" + sequenceCounter), new Version(1, 0))); events.Append(new UncommittedEvent(Guid.NewGuid(), id, typeof(object), sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged( "Name" + sequenceCounter), new Version(1, 0))); events.Append(new UncommittedEvent(Guid.NewGuid(), id, typeof(object), sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged( "Name" + sequenceCounter), new Version(1, 0))); targetStore.Store(events); var result = targetStore.ReadFrom(id, long.MinValue, long.MaxValue); result.Count().Should().Be(events.Count()); result.First().EventIdentifier.Should().Be(events.First().EventIdentifier); var streamList = events.ToList(); var resultList = result.ToList(); for (int i = 0; i < resultList.Count; i++) { Assert.IsTrue(AreEqual(streamList[i], resultList[i])); } }
public UncommittedEventStream ForSourceUncomitted(Guid id, Guid commitId, int sequenceOffset = 0) { int initialVersion = sequenceOffset == 0 ? 1 : sequenceOffset; int sequence = initialVersion; var comittedEvents = new List<CommittedEvent>(); var result = new UncommittedEventStream(commitId); foreach (var evnt in _events) { var uncommittedEvent = new UncommittedEvent(Guid.NewGuid(), id, sequence, initialVersion, DateTime.UtcNow, evnt, new Version(1, 0)); result.Append(uncommittedEvent); sequence++; } return result; }
public static UncommittedEventStream Create() { var theEventSourceId = Guid.NewGuid(); var theInitialEventSourceVersion = 0; var theCommitId = Guid.NewGuid(); var theVersion = new Version(1, 0); int sequenceCounter = 1; var events = new[] { new UncommittedEvent ( Guid.NewGuid(), theEventSourceId, sequenceCounter++, theInitialEventSourceVersion, DateTime.Now, new CustomerCreatedEvent(Guid.NewGuid(), theEventSourceId, sequenceCounter, DateTime.UtcNow, "Foo", 35), theVersion ), new UncommittedEvent ( Guid.NewGuid(), theEventSourceId, sequenceCounter++, theInitialEventSourceVersion, DateTime.Now, new CustomerNameChanged(Guid.NewGuid(), theEventSourceId, sequenceCounter, DateTime.UtcNow, "Name" + sequenceCounter), theVersion ), new UncommittedEvent ( Guid.NewGuid(), theEventSourceId, sequenceCounter++, theInitialEventSourceVersion, DateTime.Now, new CustomerNameChanged(Guid.NewGuid(), theEventSourceId, sequenceCounter, DateTime.UtcNow, "Name" + sequenceCounter), theVersion ), new UncommittedEvent ( Guid.NewGuid(), theEventSourceId, sequenceCounter++, theInitialEventSourceVersion, DateTime.Now, new CustomerNameChanged(Guid.NewGuid(), theEventSourceId, sequenceCounter, DateTime.UtcNow, "Name" + sequenceCounter), theVersion ), }; var eventStream = new UncommittedEventStream(theCommitId); foreach (var e in events) { eventStream.Append(e); } return(eventStream); }
public UncommittedEventStream ForSourceUncomitted(Guid id, Guid commitId, int sequenceOffset = 0) { int sequence = sequenceOffset + 1; int initialVersion = sequenceOffset == 0 ? 1 : sequenceOffset; var comittedEvents = new List <CommittedEvent>(); var result = new UncommittedEventStream(commitId); foreach (var evnt in _events) { var uncommittedEvent = new UncommittedEvent(Guid.NewGuid(), id, sequence, initialVersion, DateTime.UtcNow, evnt, new Version(1, 0)); result.Append(uncommittedEvent); sequence++; } return(result); }
public static UncommittedEventStream Create() { var theEventSourceId = Guid.NewGuid(); var theInitialEventSourceVersion = 0; var theCommitId = Guid.NewGuid(); var theVersion = new Version(1, 0); int sequenceCounter = 1; var events = new[] { new UncommittedEvent ( Guid.NewGuid(), theEventSourceId, typeof(object), sequenceCounter++, theInitialEventSourceVersion, DateTime.Now, new CustomerCreatedEvent(Guid.NewGuid(), theEventSourceId, sequenceCounter, DateTime.UtcNow, "Foo",35), theVersion ), new UncommittedEvent ( Guid.NewGuid(), theEventSourceId, typeof(object), sequenceCounter++, theInitialEventSourceVersion, DateTime.Now, new CustomerNameChanged(Guid.NewGuid(), theEventSourceId, sequenceCounter, DateTime.UtcNow, "Name"+sequenceCounter), theVersion ), new UncommittedEvent ( Guid.NewGuid(), theEventSourceId, typeof(object), sequenceCounter++, theInitialEventSourceVersion, DateTime.Now, new CustomerNameChanged(Guid.NewGuid(), theEventSourceId, sequenceCounter, DateTime.UtcNow, "Name"+sequenceCounter), theVersion ), new UncommittedEvent ( Guid.NewGuid(), theEventSourceId, typeof(object), sequenceCounter++, theInitialEventSourceVersion, DateTime.Now, new CustomerNameChanged(Guid.NewGuid(), theEventSourceId, sequenceCounter, DateTime.UtcNow, "Name"+sequenceCounter), theVersion ), }; var eventStream = new UncommittedEventStream(theCommitId); foreach (var e in events) eventStream.Append(e); return eventStream; }
protected override void AggregateRootEventAppliedHandler(AggregateRoot aggregateRoot, UncommittedEvent evnt) { RegisterDirtyInstance(aggregateRoot); _eventStream.Append(evnt); }
public void Saving_event_source_while_there_is_a_newer_event_source_should_throw_concurency_exception() { var targetStore = new RavenDBEventStore(_documentStore); var id = Guid.NewGuid(); int sequenceCounter = 0; var events = new UncommittedEventStream(Guid.NewGuid()); events.Append(new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerCreatedEvent("Foo", 35), new Version(1, 0))); events.Append(new UncommittedEvent(Guid.NewGuid(), id, sequenceCounter++, 0, DateTime.UtcNow, new CustomerNameChanged( "Name" + sequenceCounter), new Version(1, 0))); targetStore.Store(events); Action act = () => targetStore.Store(events); act.ShouldThrow<ConcurrencyException>(); }
public void When_contains_single_event_should_indicate_a_single_source() { var sut = new UncommittedEventStream(Guid.NewGuid()); sut.Append(new UncommittedEvent(Guid.NewGuid(), Guid.NewGuid(), typeof(object), 0, 0, DateTime.UtcNow, new object(), new Version(1, 0))); Assert.IsTrue(sut.HasSingleSource); }
public BoundedContextListener( KafkaConnectionString connectionString, ListenerConfiguration configuration, IEventConverter eventConverter, IUncommittedEventStreamCoordinator uncommittedEventStreamCoordinator, ISerializer serializer, ILogger logger, IApplicationResourceIdentifierConverter applicationResourceIdentifierConverter, IImplementationsOf <IEvent> eventTypes, IEventStore eventStore, IEventEnvelopes eventEnvelopes, IEventSequenceNumbers eventSequenceNumbers, IEventSourceVersions eventSourceVersions, ICommittedEventStreamBridge committedEventStreamBridge) { _serializer = serializer; _eventConverter = eventConverter; _uncommittedEventStreamCoordinator = uncommittedEventStreamCoordinator; _logger = logger; _applicationResourceIdentifierConverter = applicationResourceIdentifierConverter; _eventTypes = eventTypes; _eventSequenceNumbers = eventSequenceNumbers; _eventStore = eventStore; _eventEnvelopes = eventEnvelopes; _eventSourceVersions = eventSourceVersions; _committedEventStreamBridge = committedEventStreamBridge; logger.Information($"Listening on topic '{configuration.Topic}' from '{connectionString}'"); var config = new Dictionary <string, object> { { "bootstrap.servers", connectionString }, { "group.id", "simple-consumer" }, { "enable.auto.commit", true }, { "auto.commit.interval.ms", 1000 }, { "default.topic.config", new Dictionary <string, object>() { { "auto.offset.reset", "smallest" } } } }; _consumer = new Consumer <Ignore, string>(config, null, new StringDeserializer(Encoding.UTF8)); _consumer.Assign(new [] { new TopicPartition(configuration.Topic, 0) }); _consumer.OnMessage += (_, msg) => { try { logger.Trace($"Message received '{msg.Value}'"); var raw = _serializer.FromJson <dynamic[]>(msg.Value); foreach (var rawContentAndEnvelope in raw) { var eventSourceId = (EventSourceId)Guid.Parse(rawContentAndEnvelope.Content.EventSourceId.ToString()); var eventIdentifier = _applicationResourceIdentifierConverter.FromString(rawContentAndEnvelope.Envelope.Event.ToString()); var version = EventSourceVersion.FromCombined((double)rawContentAndEnvelope.Envelope.Version); var correlationId = (TransactionCorrelationId)Guid.Parse(rawContentAndEnvelope.Envelope.CorrelationId.ToString()); CorrelationId = correlationId; _logger.Trace($"Received event of with resource name '{eventIdentifier.Resource.Name}' from '{eventSourceId}' with version '{version}' in correlation '{correlationId}'"); var eventType = _eventTypes.SingleOrDefault(et => et.Name == eventIdentifier.Resource.Name); if (eventType != null) { _logger.Trace("Matching Event Type : " + eventType.AssemblyQualifiedName); var @event = Activator.CreateInstance(eventType, eventSourceId) as IEvent; _serializer.FromJson(@event, rawContentAndEnvelope.Content.ToString()); var eventSource = new ExternalSource(eventSourceId); var uncommittedEventStream = new UncommittedEventStream(eventSource); uncommittedEventStream.Append(@event, version); _logger.Information($"Committing uncommitted event stream with correlationId '{correlationId}'"); var envelopes = _eventEnvelopes.CreateFrom(eventSource, uncommittedEventStream.EventsAndVersion); var envelopesAsArray = envelopes.ToArray(); var eventsAsArray = uncommittedEventStream.ToArray(); _logger.Trace("Create an array of events and envelopes"); var eventsAndEnvelopes = new List <EventAndEnvelope>(); for (var eventIndex = 0; eventIndex < eventsAsArray.Length; eventIndex++) { var envelope = envelopesAsArray[eventIndex]; var currentEvent = eventsAsArray[eventIndex]; eventsAndEnvelopes.Add(new EventAndEnvelope( envelope .WithTransactionCorrelationId(correlationId) .WithSequenceNumber(_eventSequenceNumbers.Next()) .WithSequenceNumberForEventType(_eventSequenceNumbers.NextForType(envelope.Event)), currentEvent )); } _logger.Trace("Committing events to event store"); _eventStore.Commit(eventsAndEnvelopes); _logger.Trace($"Set event source versions for the event source '{envelopesAsArray[0].EventSource}' with id '{envelopesAsArray[0].EventSourceId}'"); _eventSourceVersions.SetFor(envelopesAsArray[0].EventSource, envelopesAsArray[0].EventSourceId, envelopesAsArray[envelopesAsArray.Length - 1].Version); _logger.Trace("Create a committed event stream"); var committedEventStream = new CommittedEventStream(uncommittedEventStream.EventSourceId, eventsAndEnvelopes); _committedEventStreamBridge.Send(committedEventStream); CorrelationId = Guid.Empty; } } } catch (Exception ex) { _logger.Error(ex, "Error during receiving"); } }; }
void Received(Topic topic, string eventAsJson) { try { _logger.Trace($"Message received 'eventAsJson'"); dynamic raw = JsonConvert.DeserializeObject(eventAsJson); foreach (var rawContentAndEnvelope in raw) { var eventSourceId = (EventSourceId)Guid.Parse(rawContentAndEnvelope.Envelope.EventSourceId.ToString()); var eventIdentifier = _applicationResourceIdentifierConverter.FromString(rawContentAndEnvelope.Envelope.Event.ToString()); var version = EventSourceVersion.FromCombined((double)rawContentAndEnvelope.Envelope.Version); var correlationId = (TransactionCorrelationId)Guid.Parse(rawContentAndEnvelope.Envelope.CorrelationId.ToString()); var eventSource = new ExternalSource(eventSourceId); CorrelationId = correlationId; _logger.Trace($"Received event of with resource name '{eventIdentifier.Resource.Name}' from '{eventSourceId}' with version '{version}' in correlation '{correlationId}'"); var eventType = _eventTypes.SingleOrDefault(et => et.Name == eventIdentifier.Resource.Name); if (eventType != null) { _logger.Trace("Matching Event Type : " + eventType.AssemblyQualifiedName); var @event = GetEventFrom(rawContentAndEnvelope, eventSourceId, eventType); var uncommittedEventStream = new UncommittedEventStream(eventSource); uncommittedEventStream.Append(@event, version); _logger.Information($"Committing uncommitted event stream with correlationId '{correlationId}'"); var envelopes = _eventEnvelopes.CreateFrom(eventSource, uncommittedEventStream.EventsAndVersion); var envelopesAsArray = envelopes.ToArray(); var eventsAsArray = uncommittedEventStream.ToArray(); _logger.Trace("Create an array of events and envelopes"); var eventsAndEnvelopes = new List <EventAndEnvelope>(); for (var eventIndex = 0; eventIndex < eventsAsArray.Length; eventIndex++) { var envelope = envelopesAsArray[eventIndex]; var currentEvent = eventsAsArray[eventIndex]; eventsAndEnvelopes.Add(new EventAndEnvelope( envelope .WithTransactionCorrelationId(correlationId) .WithSequenceNumber(_eventSequenceNumbers.Next()) .WithSequenceNumberForEventType(_eventSequenceNumbers.NextForType(envelope.Event)), currentEvent )); } _logger.Trace("Committing events to event store"); _eventStore.Commit(eventsAndEnvelopes); _logger.Trace($"Set event source versions for the event source '{envelopesAsArray[0].EventSource}' with id '{envelopesAsArray[0].EventSourceId}'"); _eventSourceVersions.SetFor(envelopesAsArray[0].EventSource, envelopesAsArray[0].EventSourceId, envelopesAsArray[envelopesAsArray.Length - 1].Version); _logger.Trace("Create a committed event stream"); var committedEventStream = new CommittedEventStream(uncommittedEventStream.EventSourceId, eventsAndEnvelopes); _committedEventStreamBridge.Send(committedEventStream); CorrelationId = Guid.Empty; } } } catch (Exception ex) { _logger.Error(ex, "Error during receiving"); } }