예제 #1
0
 public Task RegisteringAndProcessing()
 {
     return(Task.WhenAll(_eventHandlersToRun.Select(eventHandler => _eventHandlers.RegisterAndStart(
                                                        eventHandler,
                                                        (_, _) => _dispatcher.Object.Reject(new EventHandlerRegistrationResponse(), CancellationToken.None),
                                                        CancellationToken.None))));
 }
예제 #2
0
    /// <inheritdoc/>
    public override async Task Connect(
        IAsyncStreamReader <EventHandlerClientToRuntimeMessage> runtimeStream,
        IServerStreamWriter <EventHandlerRuntimeToClientMessage> clientStream,
        ServerCallContext context)
    {
        _logger.ConnectingEventHandler();
        using var cts = CancellationTokenSource.CreateLinkedTokenSource(_hostApplicationLifetime.ApplicationStopping, context.CancellationToken);
        try
        {
            var connectResult = await _reverseCallServices.Connect(runtimeStream, clientStream, context, _eventHandlersProtocol, cts.Token).ConfigureAwait(false);

            if (!connectResult.Success)
            {
                return;
            }

            using var dispatcher = connectResult.Result.dispatcher;
            var arguments = connectResult.Result.arguments;
            using var eventHandler = _configuration.Value.Fast
                ? _eventHandlerFactory.CreateFast(arguments, _configuration.Value.ImplicitFilter, dispatcher, context.CancellationToken)
                : _eventHandlerFactory.Create(arguments, dispatcher, context.CancellationToken);

            await _eventHandlers.RegisterAndStart(
                eventHandler,
                (failure, cancellation) => dispatcher.Reject(new EventHandlerRegistrationResponse {
                Failure = failure.ToProtobuf()
            }, cancellation),
                cts.Token).ConfigureAwait(false);
        }
        finally
        {
            cts.Cancel();
        }
    }