Exemple #1
0
    void OnReverseCallContextReceived(ReverseCallArgumentsContext context)
    {
        _waitForCallContextStopwatch.Stop();
        _metrics.AddToTotalWaitForFirstMessageTime(_waitForCallContextStopwatch.Elapsed);
        _logger.ReceivedReverseCallContext(_requestId, _waitForCallContextStopwatch.Elapsed);

        var pingInterval = context.PingInterval.ToTimeSpan();

        StartPinging(pingInterval);
        StartKeepaliveTokenTimeout(pingInterval);
    }
Exemple #2
0
 public void SetConnectArgumentsContext(ReverseCallArgumentsContext context, MyConnectArguments arguments)
 => arguments.Context = context;
        /// <inheritdoc/>
        public async Task <bool> Connect(TConnectArguments connectArguments, CancellationToken cancellationToken)
        {
            ThrowIfConnecting();
            lock (_connectLock)
            {
                ThrowIfConnecting();
                _connecting = true;
            }

            var streamingCall = _establishConnection();

            _clientToServer = streamingCall.RequestStream;
            _serverToClient = streamingCall.ResponseStream;
            var callContext = new ReverseCallArgumentsContext
            {
                ExecutionContext = _executionContextManager.Current.ToProtobuf(),
                PingInterval     = Duration.FromTimeSpan(_pingInterval)
            };

            _setArgumentsContext(connectArguments, callContext);
            var message = new TClientMessage();

            _setConnectArguments(message, connectArguments);

            await _clientToServer.WriteAsync(message).ConfigureAwait(false);

            using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
            linkedCts.CancelAfter(_pingInterval.Multiply(3));

            try
            {
                if (await _serverToClient.MoveNext(linkedCts.Token).ConfigureAwait(false))
                {
                    var response = _getConnectResponse(_serverToClient.Current);
                    if (response != null)
                    {
                        _logger.Trace("Received connect response");
                        ConnectResponse        = response;
                        _connectionEstablished = true;
                        return(true);
                    }
                    else
                    {
                        _logger.Warning("Did not receive connect response. Server message did not contain the connect response");
                    }
                }
                else
                {
                    _logger.Warning("Did not receive connect response. Server stream was empty");
                }

                await _clientToServer.CompleteAsync().ConfigureAwait(false);

                return(false);
            }
            catch (RpcException ex) when(ex.StatusCode == StatusCode.Cancelled)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    _logger.Debug("Reverse Call Client was cancelled by client while connecting");
                }
                else
                {
                    _logger.Warning("Reverse Call Client was cancelled by server while connecting");
                }

                return(false);
            }
        }
 /// <inheritdoc/>
 public void SetConnectArgumentsContext(ReverseCallArgumentsContext context, ConsumerSubscriptionRequest arguments)
 => arguments.CallContext = context;