Ejemplo n.º 1
0
 public override Task WriteAsync(StreamingPullRequest message)
 {
     lock (_lock)
     {
         _extends.AddRange(message.ModifyDeadlineAckIds.Select(id => new TimedId(_clock.GetCurrentDateTimeUtc(), id)));
         _acks.AddRange(message.AckIds.Select(id => new TimedId(_clock.GetCurrentDateTimeUtc(), id)));
         return(Task.FromResult(0));
     }
 }
                public override async Task WriteAsync(StreamingPullRequest message)
                {
                    await _taskHelper.ConfigureAwait(_scheduler.Delay(_writeAsyncPreDelay, CancellationToken.None));

                    var now = _clock.GetCurrentDateTimeUtc();

                    lock (_lock)
                    {
                        _extends.AddRange(message.ModifyDeadlineAckIds.Select(id => new TimedId(now, id)).ToList());
                        _acks.AddRange(message.AckIds.Select(id => new TimedId(now, id)).ToList());
                    }
                }
 public override Task WriteAsync(StreamingPullRequest message)
 {
     if (message.ModifyDeadlineAckIds.Count != 0 || message.AckIds.Count != 0)
     {
         throw new InvalidOperationException("WriteAsync must not modify deadlines or send acks/nacks.");
     }
     if (Equals(message, new StreamingPullRequest()))
     {
         // An empty message is a ping
         lock (_lock)
         {
             _streamPings.Add(_clock.GetCurrentDateTimeUtc());
         }
     }
     return(Task.FromResult(0));
 }
        public async Task StreamingPull()
        {
            // Snippet: StreamingPull(CallSettings,BidirectionalStreamingSettings)
            // Create client
            SubscriberClient subscriberClient = SubscriberClient.Create();

            // Initialize streaming call, retrieving the stream object
            SubscriberClient.StreamingPullStream duplexStream = subscriberClient.StreamingPull();

            // Sending requests and retrieving responses can be arbitrarily interleaved.
            // Exact sequence will depend on client/server behavior.

            // Create task to do something with responses from server
            Task.Run(async() =>
            {
                IAsyncEnumerator <StreamingPullResponse> responseStream = duplexStream.ResponseStream;
                while (await responseStream.MoveNext())
                {
                    StreamingPullResponse response = responseStream.Current;
                    // Do something with streamed response
                }
                // The response stream has completed
            });

            // Send requests to the server
            bool done = false;

            while (!done)
            {
                // Initialize a request
                StreamingPullRequest request = new StreamingPullRequest
                {
                    SubscriptionAsSubscriptionName = new SubscriptionName("[PROJECT]", "[SUBSCRIPTION]"),
                    StreamAckDeadlineSeconds       = 0,
                };
                // Stream a request to the server
                await duplexStream.WriteAsync(request);

                // Set "done" to true when sending requests is complete
            }
            // Complete writing requests to the stream
            await duplexStream.WriteCompleteAsync();

            // End snippet
        }
Ejemplo n.º 5
0
        public override async Task StreamingPull(StreamingPullRequest request, IServerStreamWriter <StreamingPullResponse> responseStream, ServerCallContext context)
        {
            var subscription = subscriptions[request.Id];

            subscription.SubscriberThread = new Thread(() =>
            {
                SortedList <long, ConsumeResult <string, byte[]> > toBeSend = new SortedList <long, ConsumeResult <string, byte[]> >((int)subscription.BufferSize);
                long lastTimestamp = 0;
                while (!context.CancellationToken.IsCancellationRequested) // The code here won't work if the send data is wrong.
                {
                    var consumeResult = subscription.Consumer.Consume(context.CancellationToken);
                    if (consumeResult == null)
                    {
                        continue;
                    }

                    if (consumeResult.Headers.TryGetLast("previous", out var previous))
                    {
                        if (long.TryParse(Encoding.ASCII.GetString(previous), out var previousTimestamp))
                        {
                            if (previousTimestamp == lastTimestamp)
                            {
                                toBeSend.Add(consumeResult.Timestamp.UnixTimestampMs, consumeResult);
                            }
                            else if (previousTimestamp < lastTimestamp)
                            {
                                toBeSend.Add(consumeResult.Timestamp.UnixTimestampMs, consumeResult);
                                continue;
                            }
                            else
                            {
                                _logger.LogError("This should not be possible");
                            }
                        }
                    }

                    foreach (var(key, result) in toBeSend)
                    {
                        subscription.Buffer.Post(new DataMessage()
                        {
                            Data = ByteString.CopyFrom(result.Value,
                                                       0,
                                                       result.Value.Length),
                            Index        = result.Offset.Value.ToString(),
                            Key          = (uint)result.Timestamp.UnixTimestampMs,
                            Partition    = (uint)result.Partition.Value,
                            PartitionKey = result.Key,
                            Redelivary   = false
                        });

                        lastTimestamp = result.Timestamp.UnixTimestampMs;
                    }

                    toBeSend.Clear();
                }

                subscription.Buffer.Complete();
            });
            subscription.SubscriberThread.Start();

            while (subscription.Buffer.Completion.IsCompleted)
            {
                var message = await subscription.Buffer.ReceiveAsync();

                await responseStream.WriteAsync(new StreamingPullResponse()
                {
                    Message = message
                });
            }
        }