public static IList <T> Read <T>(byte[] bytes, long offset, Func <IBinaryBufferReader, IHerculesEventBuilder <T> > eventBuilderProvider, ILog log) { var reader = new BinaryBufferReader(bytes, offset) { Endianness = Endianness.Big }; var count = reader.ReadInt32(); var result = new List <T>(count); for (var i = 0; i < count; i++) { var startPosition = reader.Position; try { result.Add(ReadEvent(reader, eventBuilderProvider(reader))); } catch (Exception e) { log.Error(e, "Failed to read event from position {Position}.", startPosition); reader.Position = startPosition; ReadEvent(reader, DummyEventBuilder.Instance); } } return(result); }
protected private void HandleEvents(RawReadStreamPayload result, StreamCoordinates queryCoordinates) { int count; using (new OperationContextToken("HandleEvents")) using (var operationSpan = tracer.BeginConsumerCustomOperationSpan("HandleEvents")) using (iterationMetric?.For("handle_time").Measure()) { // ReSharper disable once AssignNullToNotNullAttribute var reader = new BinaryBufferReader(result.Content.Array, result.Content.Offset) { Endianness = Endianness.Big }; count = reader.ReadInt32(); for (var i = 0; i < count; i++) { var startPosition = reader.Position; try { var @event = EventsBinaryReader.ReadEvent(reader, settings.EventBuilderProvider(reader)); settings.OnEvent?.Invoke(@event, queryCoordinates); } catch (Exception e) { log.Error(e, "Failed to read event from position {Position}.", startPosition); reader.Position = startPosition; EventsBinaryReader.ReadEvent(reader, DummyEventBuilder.Instance); } } operationSpan.SetOperationDetails(count); LogProgress(count); } if (count == 0) { Thread.Sleep(settings.DelayOnNoEvents); } }