// ReSharper disable once ParameterHidesMember
        protected private async Task <StreamCoordinates> SeekToEndAsync(StreamShardingSettings shardingSettings)
        {
            var query = new SeekToEndStreamQuery(settings.StreamName)
            {
                ClientShard      = shardingSettings.ClientShardIndex,
                ClientShardCount = shardingSettings.ClientShardCount
            };

            SeekToEndStreamResult result;

            using (var spanBuilder = tracer.BeginConsumerCustomOperationSpan("SeekToEnd"))
            {
                do
                {
                    result = await client.SeekToEndAsync(query, settings.ApiKeyProvider(), settings.EventsReadTimeout).ConfigureAwait(false);

                    if (!result.IsSuccessful)
                    {
                        log.Warn(
                            "Failed to seek to end for Hercules stream '{StreamName}'. " +
                            "Status: {Status}. Error: '{Error}'.",
                            settings.StreamName,
                            result.Status,
                            result.ErrorDetails);
                        await DelayOnError().ConfigureAwait(false);
                    }
                } while (!result.IsSuccessful);

                spanBuilder.SetStream(query.Name);
                spanBuilder.SetShard(query.ClientShard, query.ClientShardCount);
            }

            return(result.Payload.Next);
        }
Exemple #2
0
        public async Task <StreamCoordinates> SeekToEndAsync(
            StreamShardingSettings shardingSettings,
            CancellationToken cancellationToken = default)
        {
            var seekToEndQuery = new SeekToEndStreamQuery(settings.StreamName)
            {
                ClientShard      = shardingSettings.ClientShardIndex,
                ClientShardCount = shardingSettings.ClientShardCount
            };

            var end = await settings.StreamClient.SeekToEndAsync(seekToEndQuery, settings.EventsReadTimeout, cancellationToken).ConfigureAwait(false);

            return(end.Payload.Next);
        }
Exemple #3
0
        public async Task <SeekToEndStreamResult> SeekToEndAsync(SeekToEndStreamQuery query, string apiKey, TimeSpan timeout, CancellationToken cancellationToken = new CancellationToken())
        {
            try
            {
                var url = new RequestUrlBuilder("stream/seekToEnd")
                {
                    { Constants.QueryParameters.Stream, query.Name },
                    { Constants.QueryParameters.ClientShard, query.ClientShard },
                    { Constants.QueryParameters.ClientShardCount, query.ClientShardCount }
                }
                .Build();

                var request = Request
                              .Get(url);

                if (!string.IsNullOrEmpty(apiKey))
                {
                    request = request.WithHeader(Constants.HeaderNames.ApiKey, apiKey);
                }

                var result = await client
                             .SendAsync(request, timeout, cancellationToken : cancellationToken)
                             .ConfigureAwait(false);

                try
                {
                    var operationStatus = responseAnalyzer.Analyze(result.Response, out var errorMessage);
                    if (operationStatus != HerculesStatus.Success)
                    {
                        return(new SeekToEndStreamResult(operationStatus, null, errorMessage));
                    }

                    return(new SeekToEndStreamResult(operationStatus, ParseSeekToEndResponseBody(result.Response), errorMessage));
                }
                finally
                {
                    if (result.Response.HasContent)
                    {
                        bufferPool.Return(result.Response.Content.Buffer);
                    }
                }
            }
            catch (Exception error)
            {
                log.Warn(error);
                return(new SeekToEndStreamResult(HerculesStatus.UnknownError, null, error.Message));
            }
        }
Exemple #4
0
 public Task <SeekToEndStreamResult> SeekToEndAsync(SeekToEndStreamQuery query, TimeSpan timeout, CancellationToken cancellationToken = default) =>
 client.SeekToEndAsync(query, timeout, cancellationToken);
Exemple #5
0
 public static SeekToEndStreamResult SeekToEnd(
     [NotNull] this IHerculesStreamClient client,
     [NotNull] SeekToEndStreamQuery query,
     TimeSpan timeout,
     CancellationToken cancellationToken = default) =>
 client.SeekToEndAsync(query, timeout, cancellationToken).GetAwaiter().GetResult();
 public Task <SeekToEndStreamResult> SeekToEndAsync(SeekToEndStreamQuery query, TimeSpan timeout, CancellationToken cancellationToken = new CancellationToken()) =>
 client.SeekToEndAsync(query, settings.ApiKeyProvider(), timeout, cancellationToken);