/// <inheritdoc />
        public async Task <ReadStreamResult <T> > ReadAsync(ReadStreamQuery query, TimeSpan timeout, CancellationToken cancellationToken = default)
        {
            var result = await client.ReadAsync(query, settings.ApiKeyProvider(), timeout, cancellationToken).ConfigureAwait(false);

            if (!result.IsSuccessful)
            {
                return(new ReadStreamResult <T>(result.Status, null, result.ErrorDetails));
            }

            var payload = result.Payload;

            try
            {
                var events = EventsBinaryReader.Read(payload.Content, settings.EventBuilderProvider, log);
                return(new ReadStreamResult <T>(result.Status, new ReadStreamPayload <T>(events, payload.Next)));
            }
            catch (Exception error)
            {
                log.Warn(error);
                return(new ReadStreamResult <T>(HerculesStatus.UnknownError, null, error.Message));
            }
            finally
            {
                payload.Dispose();
            }
        }
        private ReadTimelinePayload <T> ParseResponseBody([NotNull] Response response)
        {
            var reader = new BinaryBufferReader(response.Content.Buffer, response.Content.Offset)
            {
                Endianness = Endianness.Big
            };

            var coordinates = TimelineCoordinatesReader.Read(reader);

            var events = EventsBinaryReader.Read(response.Content.Buffer, reader.Position, eventBuilderProvider, log);

            return(new ReadTimelinePayload <T>(events, coordinates));
        }
        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);
            }
        }
Пример #4
0
        private HerculesEvent TestSerialization(Action <IHerculesEventBuilder> build)
        {
            var memoryBuilder = new HerculesEventBuilder();

            memoryBuilder.SetTimestamp(defaultTimestamp);

            build(memoryBuilder);

            var memoryEvent = memoryBuilder.BuildEvent();

            var binaryWriter = new BinaryBufferWriter(16)
            {
                Endianness = Endianness.Big
            };

            binaryWriter.Write(3);

            for (var i = 0; i < 3; i++)
            {
                using (var binaryBuilder = new BinaryEventBuilder(binaryWriter, () => defaultTimestamp, Constants.EventProtocolVersion))
                {
                    build(binaryBuilder);
                }
            }

            var events = EventsBinaryReader.Read(binaryWriter.Buffer, 0, _ => new HerculesEventBuilderGeneric(), new SynchronousConsoleLog());

            events.Count.Should().Be(3);
            events.Should().AllBeEquivalentTo(memoryEvent);

            var dummyEvents = EventsBinaryReader.Read(binaryWriter.Buffer, 0, b => DummyEventBuilder.Instance, new SynchronousConsoleLog());

            dummyEvents.Count.Should().Be(3);

            return(events.Last());
        }