Ejemplo n.º 1
0
    /// <summary>
    /// Initializes a new instance of the <see cref="PingedConnection{TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse}"/> class.
    /// </summary>
    /// <param name="requestId">The request id for the gRPC method call.</param>
    /// <param name="runtimeStream">The <see cref="IAsyncStreamReader{TClientMessage}"/> to read messages to the Runtime.</param>
    /// <param name="clientStream">The <see cref="IServerStreamWriter{TServerMessage}"/> to write messages to the Client.</param>
    /// <param name="context">The <see cref="ServerCallContext"/> of the method call.</param>
    /// <param name="messageConverter">The <see cref="MethodConverter"/> to use for decoding the connect arguments and reading the desired ping interval from.</param>
    /// <param name="keepalive">The keepalive token canceller to use for keeping track of ping timeouts.</param>
    /// <param name="pingScheduler">The callback scheduler to use for scheduling accurate pings.</param>
    /// <param name="metrics">The metrics collector to use for metrics about reverse calls.</param>
    /// <param name="loggerFactory">The logger factory to use to create loggers.</param>
    public PingedConnection(
        RequestId requestId,
        IAsyncStreamReader <TClientMessage> runtimeStream,
        IAsyncStreamWriter <TServerMessage> clientStream,
        ServerCallContext context,
        IConvertReverseCallMessages <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> messageConverter,
        ICancelTokenIfDeadlineIsMissed keepalive,
        ICallbackScheduler pingScheduler,
        IMetricsCollector metrics,
        ILoggerFactory loggerFactory)
    {
        _cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(context.CancellationToken, keepalive.Token);

        _requestId     = requestId;
        _keepalive     = keepalive;
        _pingScheduler = pingScheduler;

        _wrappedReader = new WrappedAsyncStreamReader <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse>(
            requestId,
            runtimeStream,
            messageConverter,
            metrics,
            loggerFactory.CreateLogger <WrappedAsyncStreamReader <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> >(),
            _cancellationTokenSource.Token);
        _wrappedWriter = new WrappedAsyncStreamWriter <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse>(
            requestId,
            clientStream,
            messageConverter,
            metrics,
            loggerFactory.CreateLogger <WrappedAsyncStreamWriter <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> >(),
            _cancellationTokenSource.Token);

        _metrics = metrics;
        _logger  = loggerFactory.CreateLogger <PingedConnection <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> >();

        WaitForCallContextInFirstMessageThenStartPinging();
        _keepAliveExpiredRegistration = keepalive.Token.Register(NotifyKeepaliveTimedOut);
    }
Ejemplo n.º 2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PingedConnectionFactory"/> class.
 /// </summary>
 /// <param name="callbackScheduler">The callback scheduler to use for scheduling pings.</param>
 /// <param name="metricsCollector">The metrics collector to use for metrics about pinged reverse call connections.</param>
 /// <param name="loggerFactory">The logger factory to use to create loggers.</param>
 public PingedConnectionFactory(ICallbackScheduler callbackScheduler, IMetricsCollector metricsCollector, ILoggerFactory loggerFactory)
 {
     _callbackScheduler = callbackScheduler;
     _metricsCollector  = metricsCollector;
     _loggerFactory     = loggerFactory;
 }